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

I have to collect unique symbols from a set of cards in JAVA. But while giving the inputs, I am not able to get unique results

这是我试过的代码。 但是 Set 正在存储所有值并且不会删除重复项。 我做错了什么以及如何修改它? 我只将 List 用于 do while 循环,因为在 Set 中使用 contains() 时显示 error.How 我是否将其删除以提高效率?

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 class 但如果它是由你定义的自定义 class ,那么你可以重写 compareTo 中的方法那 class 根据你的需要。您可以在 Card class.

中添加以下方法
boolean compareTo(Card c){
    if(this.getsymbol()==c.getSymbol())
        return 0;

    return this.getsymbol()>c.getSymbol()?1:-1;
}

你的集合认为两张牌总是不同的(你永远不会在你的 compareTo 中返回 0)。此 compareTo 定义将阻止 Set 接受两张具有相同符号的牌。