2017-01-24 5 views
1

Haupt Berechnung zu wiederholen:Werte in der Hash-Karte unnötig

for (String keyElement : mKeys) { 

      int index = str_mFormatedString.indexOf(keyElement); 
      sendTheDataToMap(keyElement, page, index); 

      while (index >= 0) { // indexOf returns -1 if no match found 
       index = str_mFormatedString.indexOf(keyElement, index + 1); 


       if (index >= 0) { 
        sendTheDataToMap(keyElement, page, index); 
       } 
      } 
     } 

sendDataToMap Funktion:

private void sendTheDataToMap(String key, int page, int index) { 
    Pair mPair = new Pair(page, index); 
    map.putIfAbsent(key, new ArrayList<>()); 
    map.get(key).add(mPair); 
    // System.out.println("Entry added to the map...."); 
} 

Readmap Funktion:

private void readMap() { 
    for (Map.Entry<String, ArrayList<Pair<Integer, Integer>>> ee : map.entrySet()) { 
     String key = ee.getKey(); 
     ArrayList<Pair<Integer, Integer>> values = ee.getValue(); 
     // Process the values 

     System.out.print(key + " | "); 
     for (Pair value : values) 
      System.out.print(" " + value.getPage() + "." + value.getIndex()); 
     System.out.println(); 
    } 
} 

Ansatz ist einfach, las ich die mehreren Indizes ein Schlüssel aus Zeichenfolge und fügen Sie es in die Karte mit String,ArrayList<Pair<Integer, Integer>>. Ich weiß, dass ich einen kleinen Fehler bei der Hauptberechnung oder beim Lesen der Karte gemacht habe, was zu einer Duplizierung von Werten führt.

Beispiel Ausgabe:

Dose | 5,167 5,223 5,167 5,223 7,157 7,338 7,751 7,157 7,338 7,751 7,157 7,338 7,751 15,558 16,209 16,436

hervorgehoben Wiederholungsteil.

Punkt ist, ich nicht schreiben wollen mehrere Werte an erster Stelle und wenn das nicht hier dann passiert Ich will nicht mehrere Werte lesen.

Irgendwelche Hilfe?

Bearbeiten 1: Eingaben: Eine Zeichenfolge (im Grunde jede Zeichenfolge), die auf Platz verschoben wird. Für ex: Hallo, wie geht es dir? => [ 'Hallo', 'wie', 'sind', 'du?']

Eine Zeile vor Haupt Berechnung:

mKeys = splitTextToArray(str_mFormatedString); 

und die Funktion splitTextToArray()

private ArrayList<String> splittingTextToArray(String formattedTextInput) { 
    String[] tempKeys = formattedTextInput.split("\\s+"); 

    //convert to Arraylist 
    ArrayList<String> mKeys = new ArrayList<>(Arrays.asList(tempKeys)); 
    return mKeys; 
} 
+1

........... [MCVE]? –

+0

Bitte lesen Sie den Code und die Beschriftung unten, es ist einfach zu verstehen. –

+1

Verwenden Sie wie unten einfach ein Set. Eine ArrayList beschränkt sich nicht auf eindeutige Werte –

Antwort

3

verwenden Sie einen Set anstelle eines List für die Kartenwerte um Duplikate zu vermeiden:

Map<String, Set<Pair<Integer, Integer>>> map = new HashMap<>(); 
// ... 
map.putIfAbsent(key, new HashSet<>()); // Or LinkedHashSet to preserve insertion order 
map.get(key).add(mPair); 

Wenn Sie sind real ly versessen eine Liste auf, prüfen Sie, ob die Liste den Wert enthält nicht bereits vor der Zugabe:

Map<String, List<Pair<Integer, Integer>>> map = new HashMap<>(); 
// ... 
map.putIfAbsent(key, new ArrayList<>()); 

if (!map.get(key).contains(mPair)) { 
    map.get(key).add(mPair); 
} 

// probably should optimize this to get rid of the multiple calls to map.get(key) 

dafür sorgen, dass equals() und hashCode() sind zwar korrekt implementiert für Ihre Pair Klasse.

+0

Ich kann die Frage bearbeiten und hier einfügen, meines Wissens ist es korrekt. Ich werde Ihre Antwort versuchen und hier antworten –

+0

@AsifAli Bearbeiten Sie die Frage nicht mit einer Lösung. Die Frage sollte so stehen wie sie ist. –

+1

Nein, ich werde es nicht mit Antwort bearbeiten, eine andere Person braucht mehr Erklärungen über Eingaben. –

1

Arraylist kann doppelte Werte enthalten, so dass Sie entweder Set verwenden können, oder überprüfen Sie es vor put wie unten an Arraylist.

1) Declare Set anstelle von Arraylist

map.putIfAbsent(key, new HashSet<>()); 

oder

2) Prüfung vor in arralist hinzufügen. (Hierfür benötigen Sie hascode und gleich in Pair Klasse zu überschreiben.)

private void sendTheDataToMap(String key, int page, int index) { 
    Pair mPair = new Pair(page, index); 
    map.putIfAbsent(key, new ArrayList<>()); 
    if(!map.get(key).contains(mPair){ 
    map.get(key).add(mPair); 
    // System.out.println("Entry added to the map...."); 
    } 
} 
Verwandte Themen