2015-12-03 3 views
1

Я смог подсчитать элементы повторения, но не эффективно. В основном у меня есть список массивов, который имеет тип String. Пример:Как подсчитать повторение повторяющихся элементов, находящихся в массивах?

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

, если я печатать с помощью Еогеаспа затем выход:

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

выход:

вхождений = {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>. Обратите внимание, однако, это приведет к боксу ints к целым.

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 Коллекции

Смежные вопросы