TreeSet比较器

时间:2014-11-19 10:38:15

标签: java comparator treeset

我有一个TreeSet和一个自定义比较器。 我根据库存中的变化从服务器获取值

例如:如果时间= 0,那么服务器将发送股票上的所有条目(未分类)   如果时间= 200,则服务器将在时间200(未排序)

之后发送添加或删除的条目

在客户端,我正在对条目进行排序。我的问题是哪个更有效率

1>首先获取所有条目,然后调用addAll方法 要么 2 - ;逐个添加

可能有数百万条目。

/////////更新///////////////////////////////////

  private static Map<Integer, KeywordInfo> hashMap = new HashMap<Integer, KeywordInfo>();
  private static Set<Integer> sortedSet = new TreeSet<Integer>(comparator);

      private static final Comparator<Integer> comparator = new Comparator<Integer>() {
        public int compare(Integer o1, Integer o2) {
          int integerCompareValue = o1.compareTo(o2);
          if (integerCompareValue == 0) return integerCompareValue;
          KeywordInfo k1 = hashMap.get(o1);
          KeywordInfo k2 = hashMap.get(o2);
          if (null == k1.getKeyword()) {
            if (null == k2.getKeyword())
              return integerCompareValue;
            else
              return -1;
          } else {
            if (null == k2.getKeyword())
              return 1;
            else {
              int compareString = AlphaNumericCmp.COMPARATOR.compare(k1.getKeyword().toLowerCase(), k2.getKeyword().toLowerCase());
              //int compareString =  k1.getKeyword().compareTo(k2.getKeyword());
              if (compareString == 0)
                return integerCompareValue;
              return compareString;
            }
          }
        }
      };

现在有一个事件处理程序,它给我一个更新条目的ArrayList, 将它们添加到我的hashMap后,我正在调用

final Map<Integer, KeywordInfo> mapToReturn = new SubMap<Integer, KeywordInfo>(sortedSet, hashMap);

3 个答案:

答案 0 :(得分:0)

实际的实现是链接列表,因此如果你正确执行,逐个添加会更快。而且我认为在不久的将来这种行为不会改变。

对于您的问题,Statefull比较器可能有所帮助。

// snipplet, must not work fine
public class NaturalComparator implements Comparator{
    private boolean anarchy = false;
    private Comparator parentComparator;

    NaturalComparator(Comparator parent){
       this.parentComparator = parent;
    }
    public void setAnarchy(){...}
    public int compare(A a, A b){
      if(anarchy) return 1
      else return parentCoparator.compare(a,b);
    }
}
...
Set<Integer> sortedSet = new TreeSet<Integer>(new NaturalComparator(comparator));
comparator.setAnarchy(true);
sortedSet.addAll(sorted);
comparator.setAnarchy(false);

答案 1 :(得分:0)

我认为你的瓶颈可能与CPU相关的网络相关性更大。一次性获取所有新条目的批量操作将提高网络效率。

关于您的CPU,填充TreeSet所需的时间在多个add()和addAll()之间不会一致地改变。背后的原因是TreeSet依赖于AbstractCollection的addAll()(http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b27/java/util/AbstractCollection.java#AbstractCollection.addAll%28java.util.Collection%29),后者又创建了一个迭代器并多次调用add()。

所以,我对CPU方面的建议是:选择让代码更干净,更易读的方法。这可能是通过addAll()获得的。

答案 2 :(得分:0)

通常,在加载alread数据时,它会减少内存开销。这也应该是时间效率的,可能使用小缓冲区。内存分配也需要时间。

然而,时间两个解决方案,在一个单独的原型。你真的必须测试大量的数据,因为网络流量也是如此。这是一个测试驱动开发,并将QA作为实施的正确性添加到QA中。