gpt4 book ai didi

java - 在 Java 中修改 ArrayList

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:44:07 24 4
gpt4 key购买 nike

我想搜索 ArrayLst 并删除所有相同的条目。

例如,如果我的 list 是:apple, orange, banana, pear, peach, orange,

然后“orange”将被删除(两次都出现)。

我天真地尝试过:

for(String word : userlist){

for(String otherword : userlist){

...
}
}

我在其中写了如何 .remove(lastIndexOf(userword)) 如果它等于单词并且它们的索引不同。

这导致了一个接一个的异常,我很快意识到我在遍历列表时正在操作一个列表,这让一切都出错了。

所以决定复制一份 list

ArrayList<String> copylist = userlist;

for(String word : copylist){

for(String otherword : copylist){

if(word.equalsIgnoreCase(otherword)
&& copylist.lastIndexOf(word)!=copylist.lastIndexOf(otherword)){

userlist.remove(userlist.lastIndexOf(word));
userlist.remove(userlist.lastIndexOf(otherword));
}

}
}

所以我试过了,它有类似的问题。特别是 ConcurrentModificationException。在调整它之后我无法得到,在我的脑海中应该是一个相当简单的过程,在 Java 中工作。请帮忙。

最佳答案

您目前根本没有制作列表的副本。您正在声明一个新变量,该变量引用了同一列表。要复制列表,请使用:

ArrayList<String> copyList = new ArrayList<String>(userList);

但是,我建议采用不同的方法:

ArrayList<String> wordsToRemove = new ArrayList<String>();
Set<String> seenWords = new HashSet<String>();

for (String word : userList)
{
if (!seenWords.add(word))
{
wordsToRemove.add(word);
}
}

for (String word : wordsToRemove)
{
// Keep removing it until it doesn't exist any more
while (userList.remove(word)) {}
}

但是,这不会忽略大小写。为此,您需要变得更聪明:

Set<String> wordsToRemove = new TreeSet<String>(String.CASE_INSENSITIVE_ORDER);
Set<String> seenWords = new TreeSet<String>(String.CASE_INSENSITIVE_ORDER);

for (String word : userList)
{
if (!seenWords.add(word))
{
wordsToRemove.add(word);
}
}

// Now we know the words we don't want, step through the list again and
// remove them (case-insensitively, as wordsToRemove is case-insensitive)
for (Iterator<String> iterator = userList.iterator(); it.hasNext() ;)
{
if (wordsToRemove.contains(word))
{
iterator.remove();
}
}

关于java - 在 Java 中修改 ArrayList,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4323136/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com