Если вы хотите хранить предметы, которые имеют уникальные частичные данные (здесь символ карты) вместо уникальных предметов (здесь карты), вам лучше использовать карту, чем набор.
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 и проверить наличие на самой карте.
EDIT 1:
Я не знаю о вашем Card
class, но если это пользовательский класс, определенный вами, вы можете просто переопределить метод compareTo
в этом классе в соответствии с вашими потребностями. Вы можете добавить следующие методы в класс Card
.
boolean compareTo(Card c){
if(this.getsymbol()==c.getSymbol())
return 0;
return this.getsymbol()>c.getSymbol()?1:-1;
}
Ваш набор всегда считает две карты разными (вы никогда не возвращаете 0 в своем compareTo
). Это определение compareTo
остановит набор от приема двух карт с одинаковым символом.