提问人:User617290653251457439 提问时间:11/3/2022 更新时间:11/3/2022 访问量:111
填充字符串数组时检查重复项
Check for duplicates while populating a string array
问:
我很难考虑在长度为 5 的字符串数组最初为空时如何实现重复项检查。在数组中添加元素之前,我必须首先检查它是否已经存在于数组中,但是由于数组最初是空的(这意味着五个元素为空),因此会提示错误,我认为这是因为我试图将元素(我试图添加到数组中)与 null 进行比较。
我想做的是检查数组的长度是否小于限制,检查我要添加的元素在数组中是否没有重复项。如果它没有重复项,那么我会将其添加到数组中,如果它有重复项,那么我不会添加它,然后我将打印一条提示消息。
我正在处理一个具有多个类的项目,这是我的代码片段:
public class Collections {
Guardian[] guardians;
int count;
final static int MAX_GUARDIANS = 5;
public Collection () {
guardians = new Guardian[Collection.MAX_GUARDIANS];
}
public void addGuardians (Guardian guardian) {
if (this.count < MAX_GUARDIANS) {
for (int i = 0; i < guardians.length; i++) {
if (guardians[i].equals(guardian)) {
System.out.println("The guardian is already in the list!\n");
} else {
this.guardians[this.count++] = guardian;
System.out.println("Guardian "+guardian.getName()+" was added to the list!");
}
}
} else {
System.out.println("Maximum number of guardians in the list has been reached!\n");
}
}
}
是否可以将我计划添加到 null 的元素进行比较?
答:
0赞
kmeh
11/3/2022
#1
您可以尝试使用 a 来跟踪重复项,并跟踪数组中的唯一字符串。HashSet<String>
声明一个哈希集:
HashSet<String> set = new HashSet<String>();
// Or:
// Set<String> set = new HashSet<String>();
检查字符串是否在包含以下内容的集合中:
if(set.contains("Hello")) {
// String is in the set
}
使用以下命令将字符串添加到集合中:
set.add("Hello");
评论
0赞
CausingUnderflowsEverywhere
11/3/2022
这是 Java 不是 cpp 哎呀
1赞
kmeh
11/3/2022
最诚挚的歉意
0赞
User617290653251457439
11/3/2022
@kmeh如果我使用 ,我是否仍然必须使用 for 循环来遍历列表,或者 set 函数会自动执行此操作?set
1赞
kmeh
11/3/2022
不,数组现在仅用于存储您确定是唯一的字符串,并且该集合用于帮助您识别唯一字符串。所以你有一个字符串:你首先检查字符串是否在集合中。(比检查字符串是否在数组中更快、更容易)。如果不是,那么它也不会在数组中。因此,您将字符串添加到集合和数组中。如果字符串 IS 在集合中,那么您就知道它也在数组中。所以你跳过它。
0赞
User617290653251457439
11/3/2022
@kmeh非常感谢!我将在我的代码中尝试此操作。祝你有美好的一天!
0赞
CausingUnderflowsEverywhere
11/3/2022
#2
使用列表而不是数组来检查它是否已经包含该守护者。
public class Collections {
List<Guardian> guardians;
int count;
final static int MAX_GUARDIANS = 5;
public Collections () {
guardians = new LinkedList<>();
}
public void addGuardians (Guardian guardian) {
if (guardians.size() >= MAX_GUARDIANS) {
System.out.println("Maximum number of guardians in the list has been reached!\n");
return;
}
if (guardians.contains(guardian)) {
System.out.println("The guardian is already in the list!\n");
} else {
guardians.add(guardian);
System.out.println("Guardian "+guardian.getName()+" was added to the list!");
}
}
}
0赞
markspace
11/3/2022
#3
因此,当您要搜索重复项时,必须先搜索整个数组。然后,如果没有重复项,则在循环后添加一个元素。for
for (int i = 0; i < count; i++) {
if (guardians[i].equals(guardian)) {
System.out.println("The guardian is already in the list!\n");
return; // <-- add this to EXIT when find a match
}
}
// now that you've searched the whole list,
// you can add a new element
guardians[count++] = guardian;
System.out.println("Guardian "+guardian.getName()+" was added to the list!");
评论
0赞
Christopher Schneider
11/3/2022
仍然会导致NPE
1赞
Christopher Schneider
11/3/2022
另类:guardian.equals(guardians[i])
0赞
markspace
11/4/2022
我没有看到 NPE(尽管我没有测试此代码)。假设只有 5 个守护者,它应该可以工作(我认为电影中只有 5 个)。如果存在 5 个以上的守护者,则当添加太多守护者时,分配将引发 IndexOutOfBoundsException。@ChristopherSchneider
0赞
Christopher Schneider
11/4/2022
您假定您的数组已填充。如果尚未填充,则调用 ,即对 null 引用调用 equals 方法。guardian[0]
guardian[0].equals
0赞
markspace
11/4/2022
不,我正在使用 .如果 count 为 0,则根本不会进入循环。如果 count 为 1,则填充第一个元素。至少我是这么读的。count
评论
Set
Set
} else { this.guardians[this.count++] = guardian;
哈哈这是学生遇到的问题,但这样做会在第一次不匹配时添加一个元素,而不会检查数组的其余部分。您需要首先检查整个数组,没有其他子句。