Wie lasse ich mir die menge von etwas aus einer arraylist ausrechnen?

4 Antworten

Vom Beitragsersteller als hilfreich ausgezeichnet

Wie üblich, lässt sich das Zählen mit einer Schleife bewerkstelligen:

static int getNumberOfOccurences(String needle, ArrayList<String> haystack) {
  int counter = 0;

  for (String haulm : haystack) {
    if (haulm.equals(needle) {
      ++counter;
    }
  }

  return counter;
}

// main:
  ArrayList<String> names = new ArrayList<>();
  // fill with names ...
  int numberOfMartins = getNumberOfOccurences("martin", names);
  System.out.println("There are " + numberOfMartins + " in list.");
  // ...

Die Schleife läuft durch jedes Element und vergleicht dies mit dem Suchwort. Bei gleichem Wert wird ein Zähler um 1 erhöht.

Die Berechnung des Prozentwertes ist nun nur noch einfache Dreisatzrechnung. Das solltest du - auch als Anfänger - selbst hinbekommen.


regex9  03.02.2018, 22:50

Korrektur:

Ich habe hier

if (haulm.equals(needle)

noch die schließende Klammer für das if vergessen.

0

for (i=0; i<array.length; i++){
int x=0;
for (j=0; j<array.length; j++){
if (array[i]==array[j]){
x++;
}
}
System.out.println(array[i] + ": " + x + "; " + x*100/array.length + "%")
}
Ich habe hier nichts überprüft, aber meine Theorie ist folgende: Du schaust für jedes Element das ganze Array nach gleichen Elementen durch, jedes mal wenn es etwas findet, wird x erhöht. x ist am Ende dann eben die Anzahl. Es gibt sicher eine Bibliothek o.ä. die das viel schneller macht als O^2 aber für eine kurze Liste passt das ja so.

Woher ich das weiß:Berufserfahrung – Programmierer

Die Antwort von regex9 ist gut, aber es schadet nie, auch die funktionale (statt imperative) Variante zu sehen. In Java manchmal ein Krampf, aber hier geht's noch:

static Long nameOccurences(List<String> names, String name) {
    return names.stream()
            .filter(n -> n.equals(name))
            .count();
}

stream() wandelt eine Liste in einen Stream (Java 8) um. Auf dem gibt es die üblichen funktionalen Operationen map, filter, forEach, ... - auf Collections leider nicht.

Dann wird dieser Stream gefiltert - es bleiben nur noch die Namen drin, die mit dem übergebenden übereinstimmen.

count() zählt dann die Elemente, die im Stream verblieben sind.

Aufgerufen wird das Ganze über:

nameFrequency(
  Arrays.asList("martin", "frank", "josef", "günther", "ulf", "martin", "dirk", "dirk", "martin", "peter"), "martin"
)
Woher ich das weiß:Berufserfahrung – Software Engineer seit 2015, u.a. Telefónica und gutefrage

Du hast bereits eine exzellente Antwort von regex9 erhalten. Ich möchte hier noch eine Variante mit einer bereits in Java integrierten Methode anführen, diese wird im Hintergrund so ähnlich funktionieren.

Sagen wir, du hast folgende Liste:

ArrayList<String> list = new ArrayList<>();
list.add("Martin");
list.add("Frank");
list.add("Josef");
list.add("Günther");
list.add("Ulf");
list.add("Martin");
list.add("Dirk");
list.add("Dirk");
list.add("Martin");
list.add("Peter");

Nun kannst du eine statische Methode aus der Collections-Klasse verwenden:

private static double calcChance(String value) {
  int occurrences = Collections.frequency(list, value);
  double relOccurences = occurrences / (double)list.size() * 100;
  return relOccurences;
}

Der Aufruf erfolgt beispielsweise folgendermaßen:

String name = "Martin";
System.out.println("Die Chance auf den Namen " + name + " in der Liste beträgt etwa " + calcChance(name) + " %.");

Dies erzeugt folgende Ausgabe:

Die Chance auf den Namen Martin in der Liste beträgt etwa 30.0 %.