2016-04-23 11 views
0

Dieser Code im Grunde nimmt ein String-Array durchläuft es einzeln nacheinander und zeigt eine Tally von jedem Element Auftreten.Array-Ausgang eine Wiederholung mehr als es sollte

Problem ist, dass Elementnummer 3 ("One") am Ende wiederholt wird und im nicht sicher, warum, so dass die i erhalten würde löschte:

Stromausgang:

One 2 
Two 1 
Three 1 
One 2 

Code:

public static void main(String[] args) {   
    String [] myStrings = {"One", "Two", "Three", "One"};   
    StringCount(myStrings);   
} 

public static void StringCount(String [] Array) 
{ 
    int size = Array.length; 

    for (int i = 0; i < size; i++) 
    { 
     int count = 0; 

     String element = Array[i]; 

     for (int j = 0; j < size; j++) 
     { 
      if (Array[j].equals(element)){ 
       count ++; 
      } 
     } 

     System.out.println(Array[i] + " " + count); 
    } 
} 

Erwartete Ausgabe:

Antwort

1

eine Set verwenden um Duplikate zu vermeiden wie unten:

public static void StringCount(String [] Array) 
{ 
    int size = Array.length; 
    Set<String> existingElement = new HashSet<>(); 
    for (int i = 0; i < size; i++) 
    { 
     int count = 0; 

     String element = Array[i]; 

     for (int j = 0; j < size; j++) 
     { 
      if (Array[j].equals(element)){ 
       count ++; 
      } 
     } 
     // This will print the result if and only if the element has not 
     // already been added into the Set 
     if (existingElement.add(Array[i])) { 
      System.out.println(Array[i] + " " + count); 
     } 
    } 
} 

Ausgang:

One 2 
Two 1 
Three 1 
0

Da Sie jedes Element überprüfen und Sie haben ein zwei Mal, so wird es zweimal überprüft werden! Sie müssen eine Reihe von überprüften Elementen haben, also wenn Sie das Element prüfen, setzen Sie es in den Satz, und bevor Sie das nächste Element überprüfen, prüfen Sie, ob es in der Menge ist, wenn ja, dann überspringen Sie es.

2

Zuerst Sie vier gedruckte Linien erhalten, weil Sie die Ausgabe in einer Schleife aufrufen, die genau vier Mal ausgeführt wird:

for (int i = 0; i < size; i++) // size is 4 
{ 
    ... 
    System.out.println(Array[i] + " " + count); 
} 

Wie Sie die Vorkommen aller verschiedenen Strings zählen wollen, möchten Sie Karte diese Zeichenfolgen zu ihrer Zählung. Das Problem ist, dass Sie die genaue Anzahl der verschiedenen Strings nicht vorher wissen können. So haben Sie eine solche Karte und Loop-Aufbau wieder über seine Elemente (in einem zweiten Schritt):

Map<String, Integer> counts = new HashMap<>(); 

/* setup map */ 
for (int i = 0; i < size; i++) { 
    String element = Array[i]; 
    /* special case for having an element the first time: */ 
    if (!counts.containsKey(element)) { 
     counts.put(element, Integer.valueOf(0)); 
    } 
    /* increase the count for the element and store it back in map */ 
    int oldCount = counts.get(element).intValue(); 
    counts.put(element, Integer.valueOf(oldCount+1)); 
} 

/* print out values */ 
for(String element : counts.keySet()) { 
    System.out.println(element + " " + counts.get(element)); 
} 
Verwandte Themen