0

我正在尝试编写一种方法,该方法将搜索名为“items”的数组的索引,以查看相同的字符串是否包含在多个索引中(忽略大小写)。如果一个字符串不止一次出现在数组中,该方法应该输出一条消息并退出。就我现在所拥有的而言,循环有时有效,有时无效 - 例如,如果存储了字符串“house”和“hOuse”,它不会捕获它,尽管它应该。我最初有休息;找到后=真;并认为删除它可能会有所帮助,但它没有。有什么建议吗?

public void equals() {
    boolean found = false;
    for (int i = 0; i < items.length; i++) {
        for (int j = 1; j > i && j < items.length; j++) {
            if (items[i].equalsIgnoreCase(items[j])) {
                found = true;
            }
        }
    }
    if (found) {
        System.out.println("You listed the same item more than once.  Please restart and try again.");
        System.exit(0);
    }
}
4

2 回答 2

1

这是你的问题

    for (int i = 0; i < items.length; i++) {
        for (int j = 1; j > i && j < items.length; j++) {

将其更改为

    for (int i = 0; i < items.length; i++) {
        for (int j = i+1; j > i && j < items.length; j++) {

推理:如果 i 是 2 并且 j 是 1,则 j 立即不 > 1 并且内部循环立即返回。这显然不是您想要的,因为这意味着只对数组中的第一个字符串进行比较。

当然,由于 j 现在总是 > i,我们可以放弃检查:

    for (int i = 0; i < items.length; i++) {
        for (int j = i+1; j < items.length; j++) {

好多了。

顺便说一句,您可以通过将所有字符串添加到HashSet<String>http://docs.oracle.com/javase/6/docs/api/java/util/HashSet.html)并检查长度来使您的算法真正快速您的 HashSet 与原始集合的长度 - 如果它较低,则存在重复。这将在 O(nlog(n)) 而不是 O(n^2) 中运行

于 2013-03-17T22:50:12.500 回答
1

你应该改变:

for (int j = 1; j > i && j < items.length; j++)

for (int j = i + 1; j < items.length; j++)

编写该方法的更短和更简单的方法是:

public void equals() {
    Set<String> set = new TreeSet<String> (String.CASE_INSENSITIVE_ORDER);
    set.addAll(Arrays.asList(items));
    if (set.size() != items.length) {
        System.out.println("You listed the same item more than once.  Please restart and try again.");
    }
}

最后,为了让你的方法可重用,你可以这样写:

public boolean hasDuplicatesIgnoreCase(String[] items) {
    ...
    return true / false;
}
于 2013-03-17T22:51:01.243 回答