填充字符串数组时检查重复项

Check for duplicates while populating a string array

提问人:User617290653251457439 提问时间:11/3/2022 更新时间:11/3/2022 访问量:111

问:

我很难考虑在长度为 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 的元素进行比较?

java 数组 string nullpointerexception

评论

0赞 markspace 11/3/2022
顺序重要吗?如果没有,只需使用 .Set
0赞 CausingUnderflowsEverywhere 11/3/2022
这不是一个列表,而是一个数组。如果你使用的是列表,你可以只使用 list.contains()
0赞 User617290653251457439 11/3/2022
@markspace不,顺序不重要,如果我使用,我还能检查重复项吗?我会调查的,谢谢。Set
0赞 markspace 11/3/2022
} else { this.guardians[this.count++] = guardian;哈哈这是学生遇到的问题,但这样做会在第一次不匹配时添加一个元素,而不会检查数组的其余部分。您需要首先检查整个数组,没有其他子句。

答:

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