这是我尝试过的代码。但是Set存储所有的值,并且不会删除重复的值。我做错了什么?我该如何修改它?我只在do while循环中使用了List,因为在Set中使用contains((时显示了一个错误。如何移除它以提高效率?
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
Set<Card> set = new TreeSet<>();
List<Character> list = new ArrayList<>();
int count = 0;
boolean flag;
do {
Card c = new Card();
System.out.println("Enter a card: ");
c.setSymbol(sc.nextLine().trim().charAt(0));
c.setNumber(sc.nextInt());
sc.nextLine();
set.add(c);
count++;
list.add(c.symbol);
if(list.contains('a') && list.contains('b') && list.contains('c') && list.contains('d')){
flag =false;
}else {
flag = true;
}
}while(flag);
System.out.println();
System.out.println("Four symbols gathered in "+count+" Cards.");
System.out.println("Cards in Set are: ");
for(Card ca:set) {
System.out.println(ca.getSymbol()+" "+ca.getNumber());
}
sc.close();
}
}
输出应为:
Enter a card :
a 1
Enter a card :
a 2
Enter a card :
d 6
Enter a card :
c 2
Enter a card :
d 1
Enter a card :
c 1
Enter a card :
b 2
Four symbols gathered in 8 cards.
Cards in Set are :
a 1
b 2
c 2
d 6
如果您想存储具有唯一部分数据(此处为卡片符号(而不是唯一项目(此处为卡(的项目,使用Map比使用Set更好。
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
Map<Character,Card> map = new TreeMap<>();
List<Character> list = new ArrayList<>();
int count = 0;
boolean flag;
do {
Card c = new Card();
System.out.println("Enter a card: ");
c.setSymbol(sc.nextLine().trim().charAt(0));
c.setNumber(sc.nextInt());
sc.nextLine();
if(!map.containsKey(c.symbol))
map.put(c.symbol,c);
count++;
list.add(c.symbol);
if(list.contains('a') && list.contains('b') && list.contains('c') && list.contains('d')){
flag =false;
}else {
flag = true;
}
}while(flag);
System.out.println();
System.out.println("Four symbols gathered in "+count+" Cards.");
System.out.println("Cards in Set are: ");
for(char ch:map.keySet()) {
System.out.println(ch+" "+map.get(ch).getNumber());
}
sc.close();
}
}
我只是想让代码看起来更像你的代码。否则,您也可以去掉ArrayList并检查映射本身是否包含。
编辑1:
我不知道你的Card
类,但如果它是你定义的自定义类,那么你可以根据需要重写该类中的compareTo
方法。您可以在Card
类中添加以下方法。
boolean compareTo(Card c){
if(this.getsymbol()==c.getSymbol())
return 0;
return this.getsymbol()>c.getSymbol()?1:-1;
}
您的集合认为两张牌总是不同的(您的compareTo
中永远不会返回0(。此compareTo
定义将阻止集合接受具有相同符号的两张卡片。