如何删除arraylist重复值

时间:2011-01-24 03:11:46

标签: java arraylist duplicates

我正在旧系统上执行一些维护任务。我有一个包含的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中删除此类重复条目?

由于

5 个答案:

答案 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)

尝试这个简单的解决方案...... (未使用设置界面)

https://stackoverflow.com/a/19434592/369035

答案 4 :(得分:-1)

ArrayList中,我们没有机会直接删除重复的元素。我们可以使用集合来实现它,因为集合不允许重复,因此,最好使用HashSetLinkedHashSet类。请参阅reference