Java 从Arraylist中删除类似(冗余)字符串
我试图从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
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
格式。