2014-02-13 55 views
1

我已經以下:從地圖中獲得最高n個數字的最簡潔方法?

public enum InvoiceCurrency { 
    EUR(
      s -> (s.contains("€") || s.contains("EUR")) 
    ), 
    USD(
      s -> (s.contains("$") || s.contains("USD")) 
    ); 

    private final Predicate<String> predicate; 

    InvoiceCurrency(final Predicate<String> predicate) { 
     this.predicate = predicate; 
    } 

    public boolean matchesString(final String value) { 
     return predicate.test(value); 
    } 

    public static EnumMap<InvoiceCurrency, Integer> createMapping(final Stream<String> valuesStream) { 
     EnumMap<InvoiceCurrency, Integer> mapping = new EnumMap<>(InvoiceCurrency.class); 
     mapping.replaceAll((k, v) -> 0); 
     Stream<InvoiceCurrency> enums = Arrays.stream(InvoiceCurrency.values()); 
     valuesStream.forEach(
      s -> enums.forEach(
       e -> { 
        if (e.matchesString(s)) { 
         mapping.compute(e, (k, v) -> v++); 
        } 
       } 
      ) 
     ); 
     return mapping; 
    } 
} 

private InvoiceCurrency calculateCurrency() { 
    EnumMap<InvoiceCurrency, Integer> map = InvoiceCurrency.createMapping(data.words.stream().map(w -> w.content)); 
    InvoiceCurrency maximum = map.entrySet().parallelStream(). //how to continue? 
} 

這導致從枚舉的映射到「出現次數的數目」,所以EUR可以被映射到10USD1。可能,計數可能是相同的。

現在我已經盡我所能,儘可能簡潔並且有能力使用java-8,得到InvoiceCurrency屬於最高數字嗎?有沒有一種簡潔的方式來看到排序的整數計數的前2實際上具有相同的值?

我知道我可以用循環等編程它,但我希望依靠java-8精神來獲得最可維護的代碼。

回答

1

簡單的例子與Map<String, Integer>但同樣會適用於你的例子。打印前兩項(b和c或d)。

import static java.util.Collections.reverseOrder; 
import static java.util.Comparator.comparingInt; 
//... 

Map<String, Integer> map = new HashMap<>(); 
map.put("a", 2); 
map.put("b", 10); 
map.put("c", 5); 
map.put("d", 5); 
map.put("e", 1); 

map.entrySet().parallelStream() 
     .sorted(reverseOrder(comparingInt(Map.Entry::getValue))) 
     .limit(2) 
     .forEach(System.out::println); 

//or: .forEachOrdered(System.out::println); 
//to print in descending order 

注:從上B129,你也可以使用的,而不是sorted(comparingInt(Map.Entry::getValue).reversed())sorted(reverseOrder(comparingInt(Map.Entry::getValue)))

+0

看起來非常好迄今!特別是自你上次編輯以來,有沒有辦法繞開比較器? – skiwi

+0

@skiwi看起來更好嗎? – assylias

+0

是的,仍然努力去理解爲什麼'Comparator.comparingInt(Map.Entry :: getValue).reversed()'不起作用,即使在一個明確的定義(而不是lambda語句)。 – skiwi

相關問題