Мне нужно собрать уникальные символы из набора карточек в JAVA. Но, давая исходные данные, я не могу получить уникальных результатов. - PullRequest
0 голосов
/ 08 мая 2020

Это код, который я пробовал. Но Set хранит все значения и не удаляет дубликаты. Что я делаю не так и как мне это исправить? Я использовал List только для выполнения, в то время как l oop, так как при использовании contains () в Set показывал ошибку. Как мне удалить его, чтобы сделать его более эффективным?

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

1 Ответ

1 голос
/ 08 мая 2020

Если вы хотите хранить предметы, которые имеют уникальные частичные данные (здесь символ карты) вместо уникальных предметов (здесь карты), вам лучше использовать карту, чем набор.

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 остановит набор от приема двух карт с одинаковым символом.

...