Is there a no-duplicate List implementation out there?

后端 未结 11 705
悲哀的现实
悲哀的现实 2020-11-29 00:53

I know about SortedSet, but in my case I need something that implements List, and not Set. So is there an implementation out there, in the API or e

11条回答
  •  天涯浪人
    2020-11-29 01:21

    I needed something like that, so I went to the commons collections and used the SetUniqueList, but when I ran some performance test, I found that it seems not optimized comparing to the case if I want to use a Set and obtain an Array using the Set.toArray() method.

    The SetUniqueTest took 20:1 time to fill and then traverse 100,000 Strings comparing to the other implementation, which is a big deal difference.

    So, if you worry about the performance, I recommend you to use the Set and Get an Array instead of using the SetUniqueList, unless you really need the logic of the SetUniqueList, then you'll need to check other solutions...

    Testing code main method:

    public static void main(String[] args) {
    
    
    SetUniqueList pq = SetUniqueList.decorate(new ArrayList());
    Set s = new TreeSet();
    
    long t1 = 0L;
    long t2 = 0L;
    String t;
    
    
    t1 = System.nanoTime();
    for (int i = 0; i < 200000; i++) {
        pq.add("a" + Math.random());
    }
    while (!pq.isEmpty()) {
        t = (String) pq.remove(0);
    }
    t1 = System.nanoTime() - t1;
    
    t2 = System.nanoTime();
    for (int i = 0; i < 200000; i++) {
        s.add("a" + Math.random());
    }
    
    s.clear();
    String[] d = (String[]) s.toArray(new String[0]);
    s.clear();
    for (int i = 0; i < d.length; i++) {
        t = d[i];
    
    }
    t2 = System.nanoTime() - t2;
    
    System.out.println((double)t1/1000/1000/1000); //seconds
    System.out.println((double)t2/1000/1000/1000); //seconds
    System.out.println(((double) t1) / t2);        //comparing results
    

    }

    Regards, Mohammed Sleem

提交回复
热议问题