我正在做一个简单的Java程序,我需要删除String ArrayList中的所有连续重复项。
我的String ArrayList是这样的:
list = [a,b,c,c,d,a,b,c,d]
我的目标是删除所有(并且只有!)连续的重复项,以便结果为:[a,b,c,d,a,b,c,d]。如您所见,两个连续的“c”中的一个已被删除。
我试过这样的事情:
for (int i = 0; i<list.size(); i++) {
if (list.get(i).compareTo(list.get(i+1))==0) {
positionToRemove.add(i);
}
}
其中positionToRemove最后将包含连续元素的所有位置,然后我将使用list.remove()删除(仍未完成)
不幸的是我得到了
java.lang.IndexOutOfBoundsException
我很肯定有一种非常简单的方法来实现这一目标,但我现在还记不起来了!
答案 0 :(得分:1)
无需存储需要删除的元素的索引。只需通过以下方式将其删除:
int size = list.size();
for (int i = size - 1; i >= 1; i--) {
if (list.get(i).compareTo(list.get(i - 1)) == 0) {
list.remove(i);
}
}
答案 1 :(得分:0)
在for
循环的最后一次迭代中,list.get(i+1)
超出了列表的范围,因而超出了IndexOutOfBoundsException
。在任何数组/ arraylist中,最大可访问索引始终为size/length - 1
。
要解决此问题,您需要更改一下逻辑。
for (int i = 1; i<list.size(); i++) {
if (list.get(i-1).compareTo(list.get(i))==0) {
positionToRemove.add(i);
}
}
答案 2 :(得分:0)
当您使用索引+ 1或List
访问i+1
时,您会超越上次迭代中List
的范围。您可以通过将for
循环的条件设置为i < list.size() -1
来解决此问题。
for (int i = 0; i < list.size() -1; i++) {
if (list.get(i).compareTo(list.get(i+1))==0) {
positionToRemove.add(i);
}
}
答案 3 :(得分:0)
其中positionToRemove最后将包含所有位置 我将使用list.remove()删除的连续元素 (还没有完成)
您可以从列表的末尾开始,而不是存储每个位置,如果它与其左邻居相同,则直接删除当前元素。使用此方法,您无需创建包含要删除的对象的索引的其他列表。
List<String> list = new ArrayList<>(Arrays.asList("a","b","c","c","d","a","b","c","d"));
for(int i = list.size() - 1; i > 0; i--){
if(list.get(i).compareTo(list.get(i-1)) == 0){
list.remove(i);
}
}
System.out.println(list);
哪个输出:
[a, b, c, d, a, b, c, d]
答案 4 :(得分:0)
它不应达到列表的长度。您必须以-1的大小关闭遍历。
for (int i = 0; i<list.size() - 1; i++) {
if (list.get(i).compareTo(list.get(i+1))==0) {
positionToRemove.add(i);
}
}
答案 5 :(得分:0)
您可以使用Java 7使用迭代器来做到这一点。
Iterator<Integer> iterator = collection.values().iterator();
Integer previousValue = null;
while(iterator.hasNext()) {
Integer currentValue = iterator.next();
if(currentValue.equals(previousValue)){
iterator.remove();
}
previousValue = currentValue;
}