2017-01-24 1 views
1

calcul principal:Les valeurs récurrentes dans la carte de hachage inutilement

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

fonction sendDataToMap:

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

fonction Readmap:

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

approche est simple, je lis les multiples indices de une clé de chaîne et l'ajouter à la carte avec String,ArrayList<Pair<Integer, Integer>>. Je sais que j'ai fait une petite erreur soit dans le calcul principal ou en lisant la carte qui entraîne la duplication des valeurs.

sortie Exemple:

can | 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

soulignées répète partie.

Point est, je ne veux pas écrire plusieurs valeurs au premier lieu et si cela ne se passe ici alors je ne veux pas lire les valeurs multiples.

Une aide?

Édition 1: Entrées: Une chaîne (fondamentalement n'importe quelle chaîne) qui est en cours d'exécution sur l'espace. Par exemple: Bonjour comment ça va? => [ 'Bonjour', 'comment', 'sont', 'vous?]

Une ligne avant le calcul principal:

mKeys = splitTextToArray(str_mFormatedString); 

et la fonction 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

S'il vous plaît lire le code et la légende ci-dessous, c'est simple à comprendre. –

+1

Comme ci-dessous, utilisez simplement un ensemble. Un ArrayList ne se limite pas à des valeurs uniques –

Répondre

3

Utilisez un Set au lieu d'un List pour vos valeurs de carte pour éviter les doublons:

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

Si vous êtes réel ment mordicus à l'aide d'une liste, vérifiez si la liste ne contient pas déjà la valeur avant de l'ajouter:

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) 

devez vous assurer que equals() et hashCode() sont correctement mis en œuvre pour votre Pair classe bien.

+0

Je peux éditer la question et la coller ici, à ma connaissance c'est correct. Je vais essayer votre réponse et répondre ici –

+0

@AsifAli Ne pas éditer la question avec une solution. La question devrait rester telle quelle. –

+1

Non, je ne vais pas le modifier avec une réponse, une autre personne a besoin de plus d'explications sur les entrées. –

1

Arraylist peut contenir des valeurs en double de sorte que vous pouvez utiliser Set ou vérifier avant de mettre Arraylist comme ci-dessous.

1) Declare Set au lieu de Arraylist

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

ou

2) vérifier avant de l'ajouter à arralist. (Pour cela, vous devez écraser hascode et égaux dans Pair classe.)

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