Java подсчитывает появление каждого элемента в массиве

Есть ли какой-либо метод для подсчета появления каждого элемента в массиве?

Допустим, у меня есть:

String[] array = {"name1","name2","name3","name4", "name5"};

Здесь вывод будет:

name1 1
name2 1
name3 1
name4 1
name5 1

, и если у меня есть:

String[] array = {"name1","name1","name2","name2", "name2"};

Вывод будет:

name1 2
name2 3

Вывод здесь просто для демонстрации ожидаемого результата.

26
задан Makoto 1 November 2015 в 06:13
поделиться

10 ответов

Вы можете использовать MultiSet из Google Collections / Guava или Bag из Apache Commons.

Если у вас есть коллекция вместо массива, вы можете использовать addAll(), чтобы добавить все содержимое к вышеупомянутой структуре данных, а затем применить метод count() к каждому значению. SortedMultiSet или SortedBag даст вам предметы в определенном порядке.

Google Collections на самом деле имеет очень удобные способы перехода от массивов к SortedMultiset.

17
ответ дан 28 November 2019 в 06:10
поделиться

Вы можете использовать HashMap, где Key - ваша строка, а значение - count.

-1
ответ дан 28 November 2019 в 06:10
поделиться

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

public class HashMapExample {
    public static void main(String[] args) {
        stringArray();          
    }
public static void stringArray()
{
    String[] a = {"name1","name2","name3","name4", "name5"};

    Map<String, String> hm = new HashMap<String, String>();
    for(int i=0;i<a.length;i++)
    {
    String bl=(String)hm.get(a[i]);
    if(bl==null)
    {
        hm.put(a[i],String.valueOf(1));
    }else
    {
        String k=hm.get(a[i]);
        int j=Integer.valueOf(k);
        hm.put(a[i],String.valueOf(j+1));
    }

    }
    //hm.entrySet();
    System.out.println("map elements are "+hm.toString());
}

}
0
ответ дан 28 November 2019 в 06:10
поделиться

Вы можете использовать Hash Map, как показано в примере ниже:

import java.util.HashMap;
import java.util.Set;

/**
 * 
 * @author Abdul Rab Khan
 * 
 */
public class CounterExample {
    public static void main(String[] args) {
        String[] array = { "name1", "name1", "name2", "name2", "name2" };
        countStringOccurences(array);
    }

    /**
     * This method process the string array to find the number of occurrences of
     * each string element
     * 
     * @param strArray
     *            array containing string elements
     */
    private static void countStringOccurences(String[] strArray) {
        HashMap<String, Integer> countMap = new HashMap<String, Integer>();
        for (String string : strArray) {
            if (!countMap.containsKey(string)) {
                countMap.put(string, 1);
            } else {
                Integer count = countMap.get(string);
                count = count + 1;
                countMap.put(string, count);
            }
        }
        printCount(countMap);
    }

    /**
     * This method will print the occurrence of each element
     * 
     * @param countMap
     *            map containg string as a key, and its count as the value
     */
    private static void printCount(HashMap<String, Integer> countMap) {
        Set<String> keySet = countMap.keySet();
        for (String string : keySet) {
            System.out.println(string + " : " + countMap.get(string));
        }
    }
}
0
ответ дан 28 November 2019 в 06:10
поделиться

Есть несколько методов, которые могут помочь, но этот используется для цикла.

import java.util.Arrays;

public class one_dimensional_for {

private static void count(int[] arr) {

    Arrays.sort(arr);

    int sum = 0, counter = 0;

    for (int i = 0; i < arr.length; i++) {
        if (arr[0] == arr[arr.length - 1]) {
            System.out.println(arr[0] + ": " + counter + " times");
            break;
        } else {
            if (i == (arr.length - 1)) {
                sum += arr[arr.length - 1];
                counter++;
                System.out.println((sum / counter) + " : " + counter
                        + " times");
                break;
            } else {
                if (arr[i] == arr[i + 1]) {
                    sum += arr[i];
                    counter++;
                } else if (arr[i] != arr[i + 1]) {
                    sum += arr[i];
                    counter++;
                    System.out.println((sum / counter) + " : " + counter
                            + " times");
                    sum = 0;
                    counter = 0;
                }
            }
        }
    }
}

public static void main(String[] args) {
    int nums[] = { 1, 1, 1, 1, 2, 2, 2, 3, 3, 4, 5, 5, 5, 5, 6 };
    count(nums);
}

}
0
ответ дан 28 November 2019 в 06:10
поделиться

С помощью HashMap это прогулка по парку.

main(){
    String[] array ={"a","ab","a","abc","abc","a","ab","ab","a"};
    Map<String,Integer> hm = new HashMap();

    for(String x:array){

        if(!hm.containsKey(x)){
            hm.put(x,1);
        }else{
            hm.put(x, hm.get(x)+1);
        }
    }
    System.out.println(hm);
}
2
ответ дан 28 November 2019 в 06:10
поделиться

Я бы использовал хеш-таблицу с ключом in, который принимает элемент массива (здесь строка), а в качестве значения - целое число.

Затем просмотрите список, выполнив что-то вроде этого:

for(String s:array){
if(hash.containsKey(s)){
  Integer i = hash.get(s);
  i++;
}else{
  hash.put(s, new Interger(1));
}
3
ответ дан 28 November 2019 в 06:10
поделиться

Я написал решение для этого, чтобы практиковать себя. Это не так круто, как другие опубликованные ответы, но я все равно опубликую его, а затем научусь делать это, используя и другие методы. Наслаждайтесь:

public static Integer[] countItems(String[] arr)
{
    List<Integer> itemCount = new ArrayList<Integer>();
    Integer counter = 0;
    String lastItem = arr[0];

    for(int i = 0; i < arr.length; i++)
    {
        if(arr[i].equals(lastItem))
        {
            counter++;
        }
        else
        {
            itemCount.add(counter);
            counter = 1;
        }
        lastItem = arr[i];
    }
    itemCount.add(counter);

    return itemCount.toArray(new Integer[itemCount.size()]);
}

public static void main(String[] args)
{
    String[] array = {"name1","name1","name2","name2", "name2", "name3",
            "name1","name1","name2","name2", "name2", "name3"};
    Arrays.sort(array);
    Integer[] cArr = countItems(array);
    int num = 0;
    for(int i = 0; i < cArr.length; i++)
    {
        num += cArr[i]-1;
        System.out.println(array[num] + ": " + cArr[i].toString());
    }
}
3
ответ дан 28 November 2019 в 06:10
поделиться
List asList = Arrays.asList(array);
Set<String> mySet = new HashSet<String>(asList);
for(String s: mySet){

 System.out.println(s + " " +Collections.frequency(asList,s));

}
37
ответ дан 28 November 2019 в 06:10
поделиться

С помощью вы можете сделать это следующим образом:

String[] array = {"name1","name2","name3","name4", "name5", "name2"};
Arrays.stream(array)
      .collect(Collectors.groupingBy(s -> s))
      .forEach((k, v) -> System.out.println(k+" "+v.size()));

Вывод:

name5 1
name4 1
name3 1
name2 2
name1 1

Что он делает:

  • Создать Stream<String> из исходного массива
  • Сгруппировать каждый элемент по тождеству, что приведет к Map<String, List<String>>
  • Для каждой пары ключ-значение выведите ключ и размер списка

Если вы хотите получить Map, который содержит количество вхождений для каждого слова, это можно сделать, выполнив:

Map<String, Long> map = Arrays.stream(array)
    .collect(Collectors.groupingBy(s -> s, Collectors.counting()));

Для получения дополнительной информации:

Надеюсь, это поможет! :)

27
ответ дан 28 November 2019 в 06:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: