Map returning repeated values

Asked

Viewed 560 times

1

I’m making a foreach in a hashmap on the basis of the following arquivo.txt:

chaveA;6
chaveA;4
chaveB;3
chaveB;7
chaveC;1
chaveC;1
chaveD;5

For now my code is like this:

Scanner scanArquivo = new Scanner(new File("arquivo.txt"));
HashMap<String, String> mapa = new HashMap<String, String>();
String linha[];

    while (scanArquivo.hasNext()) {

        linha = scanArquivo.nextLine().split(";");
        mapa.put(linha[0], linha[1]);
        mapa.forEach((chave, valor) -> {
            if (chave.equals("prdA")) System.out.println("Primeira chave");
        });
    }   
    scanArquivo.close();

For each line, I split the file to separate the information and play it in Map. Keeping this in mind, two problems arise.

First: The map returns duplicate information. The output of this code shows me more lines than it has in the file itself.

Primeira chave
Primeira chave
Primeira chave
Primeira chave
Primeira chave
Primeira chave
Primeira chave

Second: Here is another algorithm problem. For each different key I want the highest value. How can I implement this?

1 answer

3


Let’s go in parts, the first point to highlight is related to the functioning of HashMap, it is important to say that he does not accept duplicate keys.

The presentation of equal keys is due to the way you are printing the map:

while (scanArquivo.hasNext()) {

    linha = scanArquivo.nextLine().split(";"); // *** Aqui você lê uma linha ***
    mapa.put(linha[0], linha[1]);
    mapa.forEach((chave, valor) -> { 

        // *** Para cada linha que você lê, você percorre todos os elementos do mapa
        // Desta forma, se você percorrer todos os elementos, o primeiro elemento sempre vai existir :)

        if (chave.equals("prdA")) System.out.println("Primeira chave");
    });
}   

If you happen to include in the map a key that already exists, the method will return you the previous object related to the key, for example:

 // Aqui estou simulando a leitura de seu arquivo 
 // por completo, antes de apresentar os valores

    Map<String, String> mapa = new HashMap<>();

    mapa.put("chaveA", "6");
    mapa.put("chaveA", "4"); // Ao colocar a chaveA novamente, será retornado o valor 6
    mapa.put("chaveB", "3");
    mapa.put("chaveB", "7"); // Ao colocar a chaveB novamente, será retornado o valor 3
    mapa.put("chaveC", "1");
    mapa.put("chaveC", "1"); // Ao colocar a chaveC novamente, será retornado o valor 1
    mapa.put("chaveD", "5");

This way, as you search for the highest value of each key, you will need to do a treatment while assembling your Map similar to this:

    Integer valorAnterior = mapa.put(chave, valor); // Inclui o novo valor e recupera o anterior relacionado à chave do mapa

    if( valorAnterior != null ) {
        if( valorAnterior > valor ) { // Caso exista, verifica se o anterior era maior que o atual
            mapa.put(chave, valorAnterior); // Mantêm o valor anterior se for maior que o atual
        }
    }

After you read the file, include all records on the map, now yes we can display all keys using your forEach, the result will be this:

chaveB 7
chaveA 6
chaveD 5
chaveC 1

I hope I’ve helped!


UPDATE: You can check the hashmap documentation here

  • 1

    It helped a lot brother! Vlw really!!

Browser other questions tagged

You are not signed in. Login or sign up in order to post.