我必须从 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 接受两张具有相同符号的牌。
这是我试过的代码。 但是 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 接受两张具有相同符号的牌。