Java 从Arraylist中删除类似(冗余)字符串

Java 从Arraylist中删除类似(冗余)字符串,java,android,string,arraylist,Java,Android,String,Arraylist,我试图从ArrayList中删除类似的字符串,但出现以下错误: CurrentModificationException 这里是我的方法,我传递我的原始arrayList(旧)并获得一个没有冗余字符串的新列表 ArrayList<String> removeRed(ArrayList<String> old) throws IOException { ArrayList<String> newList = new ArrayList

我试图从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) );
                    }
                }

            }
        }
    }}
ArrayList Removed(ArrayList old)引发IOException
{       
ArrayList newList=新的ArrayList();
对于(int i=0;i
请注意,我的ChopMD()返回一个特定的字符串,它工作正常。
它可以很好地处理前几个字符串,这会引发异常。如有任何解决此问题的建议,将不胜感激。谢谢

如果您在使用标准库方面没有问题(总是比较可取,为什么要重新发明轮子),请尝试

然后,要获取与ID关联的值,请执行以下操作:

int key = someObject.getID();
String value = map.get(key);
所有映射实现都使用唯一的密钥,因此无需检查冗余ID。如果尝试添加新的(密钥、值)对,则如果映射包含密钥,则将替换与ID关联的值

map.put(1, "New String");
String s = map.get(1); //s will no longer be "This string corresponds to ID=1"
如果不希望出现这种行为,您可以选择将一个映射实现子类化以忽略
.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类UniqueValueHashMap扩展了HashMap{
@凌驾
公共V输入(K键,V值){
if(集装箱箱(钥匙))
返回null;
返回super.put(键、值);
}
授权

 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
 }
公共类SomeClass{
私有映射映射=新的HashMap();
//这门课做的事
公共字符串put(整型键,字符串值){
if(地图容器(图例))
返回null;
返回map.put(键、值);
}
//…这门课做的更多
}

委派是更好的方法,请注意如何更改映射实现(可能使用TreeMap而不是HashMap),而不引入一个新类,在该类中重写TreeMap的
.put(key,value)

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

然后,要获取与ID关联的值,请执行以下操作:

int key = someObject.getID();
String value = map.get(key);
所有映射实现都使用唯一的密钥,因此无需检查冗余ID。如果尝试添加新的(密钥、值)对,则如果映射包含密钥,则将替换与ID关联的值

map.put(1, "New String");
String s = map.get(1); //s will no longer be "This string corresponds to ID=1"
如果不希望出现这种行为,您可以选择将一个映射实现子类化以忽略
.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类UniqueValueHashMap扩展了HashMap{
@凌驾
公共V输入(K键,V值){
if(集装箱箱(钥匙))
返回null;
返回super.put(键、值);
}
授权

 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
 }
公共类SomeClass{
私有映射映射=新的HashMap();
//这门课做的事
公共字符串put(整型键,字符串值){
if(地图容器(图例))
返回null;
返回map.put(键、值);
}
//…这门课做的更多
}

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

这样可以更轻松地进行迭代

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

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

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

您的错误是因为您正在更改列表,而列表仍处于迭代状态。

这样可以更轻松地进行迭代

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

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

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

您的错误是因为您正在更改列表,而列表仍处于迭代状态。

谢谢您的回复@arynaq。这并不能完全满足我的需要,因为在arrayList中,我的字符串格式为
(“ID,String”)
,这就是我使用
ChopMD()的原因
返回一个不带ID的字符串以进行比较。感谢您的回复@arynaq。这不完全符合我的需要,因为在arrayList中,我将字符串格式化为
(“ID,字符串”)
,这就是我使用
ChopMD()的原因
返回一个不带ID的字符串以进行比较。谢谢@libik。请查看我对arynaq的评论。谢谢@libik。请查看我对arynaq的评论。是否可以更改您的数据模型,使您使用的自定义对象知道如何对自身进行这些相等比较?这样您甚至可以将ID和字符串放在单独的成员变量中,这样比较速度更快,因为您不必在每次迭代中都弄乱字符串。您的自定义对象仍然可以有一个
toString()
方法,该方法将其放回您的
ID,String
格式。是否可以更改您的数据模型,使您使用的自定义对象知道如何对自身进行这些相等比较?这样,您甚至可以将ID和字符串存储在单独的成员变量中,因为您没有在每次迭代中进行字符串损坏。您的自定义对象仍然可以有一个
toString()
方法,该方法将其放回您的
ID,string
格式。