我正在尝试编写一个方法来搜索名为“items”的数组的索引,以查看是否在多个索引中包含相同的字符串(忽略大小写)。如果字符串在数组中不止一次,则该方法应输出一条消息并退出。根据我现在所拥有的,循环有时可以工作,有时也不会 - 例如,如果存储字符串“house”和“hOuse”,它将无法捕获它,尽管它应该。我最初休息了; after found = true;并认为删除它可能有所帮助,但事实并非如此。有什么建议吗?
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);
}
}
答案 0 :(得分: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++) {
推理:如果我说2并且j是1,则j立即不是> 1,内循环立即返回。这显然不是你想要的,因为它意味着比较只发生在数组中的第一个字符串。
当然,因为j现在总是&gt;我,我们可以放下支票:
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)
答案 1 :(得分: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;
}