我正在旧系统上执行一些维护任务。我有一个包含的arraylist 以下值:
a,b,12
c,d,3
b,a,12
d,e,3
a,b,12
我使用以下代码从arraylist中删除重复值
ArrayList<String> arList;
public static void removeDuplicate(ArrayList arlList)
{
HashSet h = new HashSet(arlList);
arlList.clear();
arlList.addAll(h);
}
如果找到相同的重复值,它可以正常工作。但是,如果您仔细查看我的数据, 有一些重复的条目,但不是相同的顺序。例如,a,b,12和b,a,12是 相同但但顺序不同。
如何从arraylist中删除此类重复条目?
由于
答案 0 :(得分:3)
假设条目是String。然后,您可以对每个条目进行排序,然后执行重复检查。然后,您可以将条目存储在地图中,并使用包含(键)来查看它们是否存在。
编辑:添加了完整的代码示例。
public class Test {
/**
* @param args
*/
public static void main(String[] args) {
Test test = new Test();
List<String> someList = new ArrayList<String>();
someList.add("d,e,3");
someList.add("a,b,12");
someList.add("c,d,3");
someList.add("b,a,12");
someList.add("a,b,12");
//using a TreeMap since you care about the order
Map<String,String> dupMap = new TreeMap<String,String>();
String key = null;
for(String some:someList){
key = test.sort(some);
if(key!=null && key.trim().length()>0 && !dupMap.containsKey(key)){
dupMap.put(key, some);
}
}
List<String> uniqueList = new ArrayList<String>(dupMap.values());
for(String unique:uniqueList){
System.out.println(unique);
}
}
private String sort(String key) {
if(key!=null && key.trim().length()>0){
char[] keys = key.toCharArray();
Arrays.sort(keys);
return String.valueOf(keys);
}
return null;
}
}
<强>打印强>
A,B,12
C,d,3
d,E,3
答案 1 :(得分:2)
将元素换成“Foo
”而不是“String
”,其余代码“removeDuplicate
”仍为:
public class Foo {
private String s1;
private String s2;
private String s3;
public Foo(String s1, String s2, String s3) {
this.s1 = s1;
this.s2 = s2;
this.s3 = s3;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((s1 == null) ? 0 : s1.hashCode());
result = prime * result + ((s2 == null) ? 0 : s2.hashCode());
result = prime * result + ((s3 == null) ? 0 : s3.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Foo other = (Foo) obj;
//Notice here: 'a,b,12' and 'b,a,12' will be same
if(fieldsAsList().containsAll(other.fieldsAsList())){
return true;
}
return false;
}
private List<String> fieldsAsList(){
ArrayList<String> l = new ArrayList<String>(3);
l.add(s1);
l.add(s2);
l.add(s3);
return l;
}
}
然后arList
将为ArrayList < Foo>
。
答案 2 :(得分:1)
创建一个类来包装行字符串(triplet)以提供相等的语义。实现equals()和hashCode()方法。然后使用HashSet方法删除重复项。
答案 3 :(得分:1)
尝试这个简单的解决方案...... (未使用设置界面)
答案 4 :(得分:-1)
在ArrayList
中,我们没有机会直接删除重复的元素。我们可以使用集合来实现它,因为集合不允许重复,因此,最好使用HashSet
或LinkedHashSet
类。请参阅reference。