我必须用JAVA从一组卡片中收集独特的符号.但是,在提供投入的同时,我无法获得独特的结果



这是我尝试过的代码。但是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定义将阻止集合接受具有相同符号的两张卡片。

相关内容

最新更新