1

所以,我正在制作一个随机的平假名名称生成器(不要问为什么,好吗?)我遇到了一些问题。随机名称生成器在大多数情况下都可以正常工作,但有时由于某种原因它会生成一长串重复的辅音。因此,我没有像任何普通程序员那样尝试直接解决问题,而是决定尝试扫描 ArrayList 并在随机生成后删除重复的字符:

ArrayList<String> name = new ArrayList<String>(); 
Iterator <String> it   = name.iterator();  
...      // insert random generation here                   
for (h = 0; h < s; h++) { // s is the length of the ArrayList
  ...    
  String curInd = name.get(h);
  String nextInd = name.get(h+1);
  if (curInd.equals(nextInd)) { // NOT 
    name.remove(h);             // WORKING
    s--;                        // :(
  }
}

String previousName = "";
while (it.hasNext()) {
String currentName = it.next();
if (currentName.equals(previousName)) {
    it.remove();
}
previousName = currentName;
}

这不起作用。我没有收到错误或任何错误,它只是不会删除重复的字符(或者更确切地说是重复的字符串,因为我将每个字符都设为字符串。)可能是什么问题?

4

5 回答 5

5

删除项目后,您正在更改索引。尝试使用如下Iterator.remove()函数:

Iterator<String> it = name.iterator();
String previousName = "";

while (it.hasNext()) {
    String currentName = it.next();
    if (currentName.equals(previousName)) {
        it.remove();
    }
    previousName = currentName;
}

或者,您可以使用以下单行删除所有重复项:

names = new ArrayList<String>(new LinkedHashSet<String>(names));

或者更好的是,如果您不想要任何重复项,请从一开始就使用LinkedHashSetorHashSet代替。ArrayList

于 2013-11-04T05:41:03.680 回答
2

您应该使用Iterator.remove以在遍历列表时删除元素。

于 2013-11-04T05:36:40.160 回答
0

索引需要小于lengthList

 String nextInd = name.get(h+1);

上面的语句会抛出IndexOutOfBoundsException.

于 2013-11-04T05:39:11.783 回答
0

使用 HashSet,它会自动删除重复的元素,但按字母顺序对元素进行排序。

对于 Arraylist,尝试使用它。这可能会有所帮助。

              int size=headlines.size();
     for (int i = 0; i < size - 1; i++) {
            // start from the next item after strings[i]
            // since the ones before are checked
            for (int j = i + 1; j < size; j++) {
                // no need for if ( i == j ) here
                if (!headlines.get(j).equals(headlines.get(i)))
                    continue;

                headlines.remove(j);
                // decrease j because the array got re-indexed
                j--;
                // decrease the size of the array
                size--;
            } // for j
        } // for i
于 2013-11-04T05:41:55.570 回答
0

您可以使用Set某种自动删除重复元素,例如...

ArrayList<String> name = new ArrayList<String>();
name.add("A");
name.add("A");
name.add("B");
name.add("B");
name.add("B");
name.add("C");
name.add("C");
name.add("C");
System.out.println(name);
Set<String> set = new TreeSet<String>();
set.addAll(name);
System.out.println(set);

当然,这将删除所有重复项,而不仅仅是那些出现在彼此旁边的...

例如...

[A, A, B, B, B, C, C, C]
[A, B, C]

或者...

[A, B, C, B, C, B, C, A]
[A, B, C]

所以它可能无法满足您的即时需求...

于 2013-11-04T05:47:45.250 回答