2015-02-25 2 views
0

Мне нужно упаковать 3000 различных тележек, каждая корзина имеет налоги, такие как 7%, 15% и/или 19%. Я хранил налоги в Byte, Packets в Packet. Если 1000 Пакетов имеют одинаковые налоги (например, 7% и 19%), Пакет должен переуступать набор одинаковых налогов (с кодом cartTaxes).Cache TreeSet для статистики

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

    // This line is bad because there are 3000 similar TreeSets: 
    // p.setTaxes(cartTaxes); 

    // Instead i like to cache same taxes to same TreeSets 

    // Insert if not exists.... 
    if (!cachedTaxes.contains(cartTaxes)){ 
     p.setTaxes(cartTaxes); 
     // ... and cache for others! 
     cachedTaxes.add(cartTaxes); 
    } else { 
     // Use already instanticated, cached, value 
     p.setTaxes(cachedTaxes.get(cartTaxes)); <<-----ERROR: function get unknown. 
    } 
    packets.add(p); 
} 

Любая идея?

ответ

0

Вы должны использовать карту для хранения значений, которые вы можете найти.

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

Tax cachedTax = map.putIfAbsent(tax, t -> t); 
p.setTaxes(cachedTax); 

Это использует Java-8 в putIfAbsent, но вы можете сделать то же самое в Java 7, с большим количеством кода.

Если вы используете Java 7 вы можете сделать

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

Tax cachedTax = map.get(tax); 
if (cachedTax == null) 
    map.put(tax, cachedTax = tax); 
p.setTaxes(cachedTax); 
+0

Hashmap? У меня никогда не было значений «null» или «null». –

+0

@PeterRader, в чем ваш вопрос или сомнения? –

+0

Просто подумайте, что 'Hashtable' будет лучше соответствовать. К несчастью, его Java7. –

0

Я сделал это так:

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); 
} 

Я понимаю, что кэширование в ответственности самого Packet. Таким образом, идентификатор изменил сеттер.

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; 
    } 
    } 
} 
Смежные вопросы