2015-12-03 233 views
1

我能夠計算重複元素,但不是以有效的方式。基本上我有一個String類型的數組列表。例如:如何計算數組中重複元素的重複次數?

ArrayList<String> s=new ArrayList<String>(); 

如果I打印使用的foreach當時的輸出是:

[1,2] 
[1,4] 
[4] 
[3,5] 

什麼是一種有效的方法,當有多個陣列來計數數字的重複?任何形式的幫助表示讚賞。

最終輸出: 1重複2次。 2是1次重複。 等

+1

請讓一個清晰的問題。顯示你的代碼。提供示例輸入+預期輸出。 – Manu

+3

從'String'中提取數字並使用'Map'來計算每個數字的出現次數。 – SomeJavaGuy

+0

如果這些數字的範圍很小,您甚至可以使用索引是數字的數組,數據是此數字的數量。否則,你可以使用一個HashMap – VicX

回答

1

你可以使用a counting collector

public static void main(String[] args) { 
    List<String> s = Arrays.asList("[1,2]", "[1,4]", "[4]", "[3,5]"); 
    Map<Integer, Long> occurences = s.stream() 
        .flatMap(abc::parseString) 
        .collect(groupingBy(i -> i, counting())); 
    System.out.println("occurences = " + occurences); 
} 

private static Stream<Integer> parseString(String s) { 
    String[] numbers = s.substring(1, s.length() - 1).split(","); 
    return Arrays.stream(numbers).map(Integer::parseInt); 
} 

輸出:

OCCURENCES = {1 = 2,2 = 1,3 = 1,4 = 2,5 = 1}

2

如果您願意使用第三方庫,您可以使用支持原始包的GS Collections。 Bag是一個數據結構,用於跟蹤每個獨特元素的出現情況。使用IntBag可以減少您在用例中需要的拳擊數量。

CharAdapter remove = CharAdapter.adapt("[]"); 
IntBag counts = 
    Lists.mutable.with("[1,2]", "[1,4]", "[4]", "[3,5]") 
     .asLazy() 
     .collectWith(StringIterate::rejectChar, remove::contains) 
     .flatCollect(StringIterate::csvTokensToList) 
     .collectInt(Integer::parseInt) 
     .toBag(); 
Assert.assertEquals(2, counts.occurrencesOf(1)); 
Assert.assertEquals(1, counts.occurrencesOf(2)); 

如果你需要值排序輸出,你可以使用一個SortedBag<Integer>代替。但是請注意,這會導致將整數鑲嵌到整數。

CharAdapter remove = CharAdapter.adapt("[]"); 
SortedBag<Integer> counts = 
    Lists.mutable.with("[1,2]", "[1,4]", "[4]", "[3,5]") 
     .asLazy() 
     .collectWith(StringIterate::rejectChar, remove::contains) 
     .flatCollect(StringIterate::csvTokensToList) 
     .collect(Integer::parseInt) 
     .toSortedBag(); 
Assert.assertEquals(2, counts.occurrencesOf(1)); 
Assert.assertEquals(1, counts.occurrencesOf(2)); 
System.out.println(counts.toStringOfItemToCount()); 

輸出:

{1=2, 2=1, 3=1, 4=2, 5=1} 

注:我在GS正宗開發商