Java 统计数据的缓存树集

Java 统计数据的缓存树集,java,set,Java,Set,我需要包装3000辆不同的车,每辆车都有7%、15%和/或19%的税费。我将税存储在字节中,将数据包存储在数据包中。如果1000个数据包具有相同的税(示例中为7%和19%),则该数据包应参考相同的税集(代码中名为cartaxes) SortedSet cachedTaxes=新树集(); 设置数据包=新树集(); 用于(购物车:购物车){ SortedSet-cartTaxes=新树集(cart.getTaxesAllItems()); 数据包p=新数据包(); //这条线不好,因为有3000个

我需要包装3000辆不同的车,每辆车都有7%、15%和/或19%的税费。我将税存储在
字节中,将
数据包存储在
数据包中。如果1000个数据包具有相同的税(示例中为7%和19%),则该数据包应参考相同的税集(代码中名为
cartaxes

SortedSet cachedTaxes=新树集();
设置数据包=新树集();
用于(购物车:购物车){
SortedSet-cartTaxes=新树集(cart.getTaxesAllItems());
数据包p=新数据包();
//这条线不好,因为有3000个类似的树集:
//p.setTaxes(Cartaxes);
//相反,我喜欢将相同的税缓存到相同的树集
//如果不存在,则插入。。。。
如果(!cachedTaxes.contains(cartaxes)){
p、 税收(关税);
//…并为其他人缓存!
cachedTaxes.add(cartaxes);
}否则{
//使用已实例化、缓存的值

p、 setTaxes(cachedTaxes.get(cartaxes));您应该使用映射来存储可以查找的值

Map<Tax, Tax> map = new HashMap<>();

Tax cachedTax = map.putIfAbsent(tax, t -> t);
p.setTaxes(cachedTax);
Map Map=newhashmap();
Tax cachedTax=map.putIfAbsent(Tax,t->t);
p、 设定税收(缓存税);
这使用了Java8的putIfAbsent,但是您可以在Java7中使用更多的代码来做同样的事情

如果您使用的是Java7,您可以

Map<Tax, Tax> map = new HashMap<>();

Tax cachedTax = map.get(tax);
if (cachedTax == null)
    map.put(tax, cachedTax = tax);
p.setTaxes(cachedTax);
Map Map=newhashmap();
Tax cachedTax=map.get(Tax);
if(cachedTax==null)
map.put(tax,cachedTax=tax);
p、 设定税收(缓存税);
我是这样做的:

Set<Packet> packets = new TreeSet<Packet>();
for (Cart cart: carts) {
    SortedSet<Byte> cartTaxes = new TreeSet(cart.getTaxesAllItems());
    Packet p = new Packet();
    p.setTaxes(cartTaxes);
    packets.add(p);
}

Hashmap?我从来没有
null
值,也没有
null
键。@PeterRader你的问题或疑问是什么?想想
Hashtable
会更匹配。不幸的是它的Java7。@PeterRader树集合有O(log N)访问时间,而哈希集合有O(1)摊销。您应该使用散列集合,除非您确实需要排序集合,而且您似乎不需要。@PeterRader无论如何,我建议仅在您真正想这样做时使用排序集合,例如,您的税务代码示例可能有意义,尽管我怀疑它们也不需要排序。
Set<Packet> packets = new TreeSet<Packet>();
for (Cart cart: carts) {
    SortedSet<Byte> cartTaxes = new TreeSet(cart.getTaxesAllItems());
    Packet p = new Packet();
    p.setTaxes(cartTaxes);
    packets.add(p);
}
private static final Set<SortedSet<Byte>> cache = new HashSet<SortedSet<Byte>>();
public synchronized void setTaxes(SortedSet<Byte> taxes) {
  if (!cache.contains(taxes)){
     cache.add(taxes);
  }
  for (SortedSet<Byte> cached : cache){
    if (cached.equals(taxes)) {
      this.taxes = cached;
      return; 
    }
  }
}