繁体   English   中英

在Java中删除对象数组列表中的重复项

[英]remove duplicates in list of object array in java

import java.util.ArrayList;
import java.util.List;
public class mainPage {
    public static void main(String[] args) {
        testMethod();
    }
    public static void testMethod() {
        List<Object[]> obj = new ArrayList<Object[]>();

        /*START: Populating obj with test data */
        for (int i = 0; i <= 10; i++) {
            if (i == 5 || i == 6) {
                Object[] value = new Object[] { "hello", "world", "GoodEvening" };
                obj.add(value);
            } else {
                Object[] value = new Object[] { "good", "morning", "helloo" };
                obj.add(value);
            }
        }
        /*END : Populating obj with test data */

        for (Object[] jj : obj) {
            System.out.println("values:   " + jj[0] + "       " + jj[1] + "      " + jj[2]);
        }

        // need a List<Object[]> obj with out duplicates
    }
}

以上代码的结果是,

values:   good       morning      helloo
values:   good       morning      helloo
values:   good       morning      helloo
values:   good       morning      helloo
values:   good       morning      helloo
values:   hello       world      GoodEvening
values:   hello       world      GoodEvening
values:   good       morning      helloo
values:   good       morning      helloo
values:   good       morning      helloo
values:   good       morning      helloo

在这里,我生成了一个样本数据,并且我在项目中面临着类似的情况。

我想删除重复的记录,有效的方法是什么。

结果必须是:

values:   hello       world      GoodEvening
values:   good       morning      helloo

尝试:

List<Object[]> obj = new ArrayList<Object[]>();

// rest of your code goes here

Comparator<Object[]> comp = new Comparator<Object[]>(){
    @Override
    public int compare(Object[] o1, Object[] o2) {
        if( o1.length != o2.length){
            return o1.length - o2.length;
        }
        for( int i = 0; i < o1.length; i++){
            int val = o1[i].toString().compareTo(o2[i].toString());
            if( val != 0 ){
                return val;
            }
        }
        return 0;
    }
};

Set<Object[]> mySet = new TreeSet<>( comp );
mySet.addAll(obj);

for (Object[] jj : mySet) {
    System.out.println("values:   " + jj[0] + "       " + jj[1] + "      " + jj[2]);
}

另一种方法,仍然是使用TreeSet但是使用更干净的Comparator

for (int i = 0; i <= 10; i++) {
    if (i == 5 || i == 6) {
        obj.add(new Object[] { "hello", "world", "GoodEvening" });
    } else {
        obj.add(new Object[] { "good", "morning", "helloo" });
    }
}

Set<Object[]> result = new TreeSet<>(new Comparator<Object[]>() {
    @Override
    public int compare(final Object[] o1, final Object[] o2) {
        if (Arrays.equals(o1, o2)) {
            return 0;
        }
        return Arrays.hashCode(o1) - Arrays.hashCode(o2);
    }
});
result.addAll(obj);
for (Object[] array : result) {
    System.out.println(Arrays.toString(array));
}

输出:

[hello, world, GoodEvening]
[good, morning, helloo]

一种实现方法是使用HashSet( https://docs.oracle.com/javase/8/docs/api/java/util/HashSet.html )。 如果列表中已经有相同的元素,它将拒绝将项目添加到列表中。 但是,将不保留元素返回的顺序。 您可能必须为对象添加自己的equals方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM