Map returning repeated values

1

I am making a foreach in hashmap based on the following arquivo.txt :

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

For the time being my code looks 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 the Map. With this in mind, two problems arise.

First: The map returns me 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?

    
asked by anonymous 30.12.2018 / 19:22

1 answer

3

Let's put it in parts, the first point to point out is related to how HashMap works, it's important to say that it does not accept duplicate keys .

Displaying the same 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");
    });
}   

In case you include a key that already exists on the map, the method will return 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");

In this way, as you are looking for the highest value of each key, you will have to make a treatment when setting up your Map like 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 the records in the map, now we can display all the keys using your forEach , the result will be this:

chaveB 7
chaveA 6
chaveD 5
chaveC 1

I hope I have helped!

UPDATE : You can check out HashMap documentation here

    
30.12.2018 / 20:53