簡體   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