Java zählt das Vorkommen jedes Elements in einem Array

Lesezeit: 5 Minuten

Java zahlt das Vorkommen jedes Elements in einem Array
Favolas

Gibt es eine Methode zum Zählen des Vorkommens jedes Elements in einem Array?

Nehmen wir an, ich habe:

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

Hier wird die Ausgabe sein:

name1 1
name2 1
name3 1
name4 1
name5 1

und wenn ich habe:

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

Die Ausgabe wäre:

name1 2
name2 3

Die Ausgabe hier dient nur dazu, das erwartete Ergebnis zu demonstrieren.

  • Wahrscheinlich nicht, aber es sollte für Sie einfach genug sein, eine Methode selbst zu implementieren, wenn man bedenkt, wie einfach die Aufgabe ist. Es wird in O (n) funktionieren, egal was ich denke (es sei denn, Sie treffen einige Annahmen über das Sortieren, um diese Geschwindigkeit zu erhöhen).

    – Gnom

    11. November 11 um 18:59 Uhr

Java zahlt das Vorkommen jedes Elements in einem Array
Damian

List asList = Arrays.asList(array);
Set<String> mySet = new HashSet<String>(asList);

for(String s: mySet){
 System.out.println(s + " " + Collections.frequency(asList,s));
}

  • Meiner Erfahrung nach ist Collections.frequency zu langsam. Vermeiden Sie es, wenn die Leistung ein Problem darstellt.

    – akshayb

    2. Juni 14 um 7:10 Uhr

  • Nicht wirklich, wenn es sich um ein HashSet oder eine HashMap handelt.

    – Damian

    3. Juni 16 um 23:17 Uhr

Java zahlt das Vorkommen jedes Elements in einem Array
Alexis C.

Mit Java-8 können Sie es so machen:

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

Ausgabe:

name5 1
name4 1
name3 1
name2 2
name1 1

Was es tut, ist:

  • Ein … kreieren Stream<String> aus dem ursprünglichen Array
  • Gruppieren Sie jedes Element nach Identität, was zu a führt Map<String, List<String>>
  • Geben Sie für jedes Schlüsselwertpaar den Schlüssel und die Größe der Liste aus

Wenn Sie eine bekommen möchten Map die die Anzahl der Vorkommen für jedes Wort enthält, kann Folgendes getan werden:

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

Für weitere Informationen:

Ich hoffe es hilft! 🙂

1643911628 805 Java zahlt das Vorkommen jedes Elements in einem Array
Uri

Sie könnten eine verwenden MultiSet aus Google Collections/Guava oder a Bag von ApacheCommons.

Wenn Sie anstelle eines Arrays eine Sammlung haben, können Sie verwenden addAll() um den gesamten Inhalt zu der obigen Datenstruktur hinzuzufügen, und wenden Sie dann die an count() Methode zu jedem Wert. EIN SortedMultiSet oder SortedBag würde Ihnen die Artikel in einer definierten Reihenfolge geben.

Google Collections bietet tatsächlich sehr bequeme Möglichkeiten, von Arrays zu a zu wechseln SortedMultiset.

  • Der Link zu Tasche ist 404.

    – james.garriss

    21. November 13 um 20:53 Uhr

  • Ich habe getCardinalityMap() von org.apache.commons.collections.CollectionUtils verwendet.

    – Tuan

    17. September 14 um 17:54 Uhr


Ich habe eine Lösung dafür geschrieben, um mich selbst zu üben. Es scheint nicht annähernd so großartig zu sein wie die anderen geposteten Antworten, aber ich werde es trotzdem posten und dann lernen, wie man dies auch mit den anderen Methoden macht. Genießen:

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

1643911628 910 Java zahlt das Vorkommen jedes Elements in einem Array
Deva44

Mit HashMap ist es ein Spaziergang im Park.

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

  • das funktioniert, könnte aber wenig über hm.put(x, hm.get(x)+1) erklären; Teil ? Vielen Dank

    – ikel

    21. Juli 21 um 16:03 Uhr

  • Ich meinte, wie verhält sich hm.get(x) eigentlich wie ein Zähler, nicht wie ein Artikelwert?

    – ikel

    21. Juli 21 um 16:12 Uhr

  • @ikel Wenn der Schlüssel (in diesem Fall x) bereits im hm vorhanden ist, holen Sie sich den entsprechenden Wert, erhöhen Sie ihn um eins und speichern Sie ihn zurück.

    – Deva44

    22. Juli 21 um 6:04 Uhr

1643911628 508 Java zahlt das Vorkommen jedes Elements in einem Array
Jason Rogers

Ich würde eine Hashtabelle verwenden, bei der der Schlüssel das Element des Arrays (hier Zeichenfolge) und den Wert eine ganze Zahl enthält.

Gehen Sie dann die Liste durch und tun Sie Folgendes:

for(String s:array){
if(hash.containsKey(s)){
  Integer i = hash.get(s);
  i++;
}else{
  hash.put(s, new Interger(1));
}

  • das funktioniert, könnte aber wenig über hm.put(x, hm.get(x)+1) erklären; Teil ? Vielen Dank

    – ikel

    21. Juli 21 um 16:03 Uhr

  • Ich meinte, wie verhält sich hm.get(x) eigentlich wie ein Zähler, nicht wie ein Artikelwert?

    – ikel

    21. Juli 21 um 16:12 Uhr

  • @ikel Wenn der Schlüssel (in diesem Fall x) bereits im hm vorhanden ist, holen Sie sich den entsprechenden Wert, erhöhen Sie ihn um eins und speichern Sie ihn zurück.

    – Deva44

    22. Juli 21 um 6:04 Uhr

1643911629 374 Java zahlt das Vorkommen jedes Elements in einem Array
naveen Tekkem

Dies kann auf sehr einfache Weise mit Sammlungen erfolgen. Finden Sie den Code unten

String[] array = {"name1","name1","name2","name2", "name2"};
List<String> sampleList=(List<String>) Arrays.asList(array);
for(String inpt:array){
int frequency=Collections.frequency(sampleList,inpt);
System.out.println(inpt+" "+frequency);
}

Hier sieht die Ausgabe wie folgt aus: name1 2 name1 2 name2 3 name2 3 name2 3

Um das Drucken redundanter Schlüssel zu vermeiden, verwenden Sie HashMap und erhalten Sie die gewünschte Ausgabe

  • Wir können die obige Beispielliste auch an den Konstruktor von TreeSet übergeben und dann eine Schleife ausführen, um das Ergebnis zu erhalten

    – naveenTekkem

    1. August 19 um 4:45 Uhr

.

758450cookie-checkJava zählt das Vorkommen jedes Elements in einem Array

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy