0

我正在尝试从 ArrayList 中删除类似的字符串,但出现此错误:

 CurrentModificationException

这是我传递原始arrayList(旧)并获得没有冗余字符串的新列表的方法。

ArrayList<String> removeRed(ArrayList<String> old) throws IOException
{       

    ArrayList<String> newList = new ArrayList<String>();


    for (int i=0; i< old.size(); i++)
    {
        if(newList.size() < 1)
        {
            newList.add(old.get(0));

        } else{

            for(Iterator<String> iterator = newList.iterator(); iterator.hasNext();) {

                while(iterator.hasNext())
                {
                    if(!ChopMD((String) iterator.next()).equals(ChopMD(old.get(i))))
                    {
                        newList.add(old.get(i));
                        Log.e("new algo", "" + old.get(i) );
                    }
                }

            }
        }
    }}

请注意,我的 ChopMD() 返回一个特定的字符串,它工作正常。它适用于前几个字符串,这会引发异常。任何解决此问题的建议将不胜感激。谢谢。

4

2 回答 2

6

如果您对使用标准库没有任何问题(总是更可取,为什么要重新发明轮子)尝试

List<String> uniques = new ArrayList<String>(new HashSet<String>(oldList));

HashSet仅包含唯一的字符串,并且ArrayList构造函数采用任何Collection(包括 a HashSet)来构建列表。

从您的评论来看,您似乎正在尝试使用 ArrayList 实现具有唯一键的关联数组。更好的方法是使用像 HashMap 这样的Map实现将 ID 与其关联的字符串配对。

Map<Integer, String> map = new HashMap<>();
map.put(1, "This string corresponds to ID=1");
map.put(3, "Donald Ducks Nephews");
map.put(7, "Is a Prime");

然后获取与 ID 关联的值:

int key = someObject.getID();
String value = map.get(key);

所有 Map 实现都使用唯一键,因此您无需检查冗余 ID,如果您尝试添加新的 (key,value) 对,如果映射包含键,则与 ID 关联的值将被替换。

map.put(1, "New String");
String s = map.get(1); //s will no longer be "This string corresponds to ID=1"

如果您不希望这种行为,您可以选择将其中一个 Map 实现子类化以.put(key, value)在地图包含key,value或委托.put(key,value)给其他类时忽略。

子类化:

public class UniqueValueHashMap<K,V> extends HashMap<K, V>{
@Override
public V put(K key, V value) {
    if (containsKey(key))
        return null;
    return super.put(key, value);
}

委派

 public class SomeClass {
    private Map<Integer, String> map = new HashMap<>();

    // ...stuff this class does

    public String put(int key, String value) {
        if (map.containsKey(key))
            return null;
        return map.put(key, value);
    }

    // ...more stuff this class does
 }

委托是更好的方法,请注意如何在不引入覆盖.put(key,value)TreeMap 的新类的情况下更改映射实现(可能使用 TreeMap 而不是 HashMap)。

于 2013-10-12T18:39:24.260 回答
0

你可以通过这个更容易地迭代

    for (String oldString : old){
        for (String newString : newList){

        }
    }

您也可以使用 Set 来拥有唯一的字符串

    Set<String> newList = new HashSet<String>();

您的错误是因为您正在更改列表,而它仍在迭代。

于 2013-10-12T18:42:52.870 回答