所以,我正在制作一个随机的平假名生成器(不要问为什么,好吗?)并且我遇到了一些问题。随机名称生成器在大多数情况下工作正常但有时由于某种原因它会生成长串的重复辅音。因此,我没有像普通程序员那样直接解决问题,而是决定尝试扫描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;
}
这不起作用。我没有收到错误或任何错误,它只是不会删除重复的字符(或者更确切地说是重复的字符串,因为我将每个字符都设置为字符串。)可能是什么问题?
答案 0 :(得分: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));
或者甚至更好,如果您不想要任何重复项,请从一开始就使用LinkedHashSet
或HashSet
代替ArrayList
。
答案 1 :(得分:2)
您应该使用Iterator.remove
以便在遍历列表时删除元素。
答案 2 :(得分:0)
索引必须小于length
的{{1}}。
List
上述语句将抛出 String nextInd = name.get(h+1);
。
答案 3 :(得分: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
答案 4 :(得分: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]
所以它可能无法满足您的直接需求......