Search code examples
javafor-loophashmap

Hashmap in for loop not reading all the input


This is for AOC day 2. The input is something along the lines of

"6-7 z: dqzzzjbzz

13-16 j: jjjvjmjjkjjjjjjj

5-6 m: mmbmmlvmbmmgmmf

2-4 k: pkkl

16-17 k: kkkkkkkkkkkkkkkqf

10-16 s: mqpscpsszscsssrs

..."

It's formatted like 'min-max letter: password' and seperated by line. I'm supposed to find how many passwords meet the minimum and maximum requirements. I put all that prompt into a string variable and used Pattern.quote("\n") to seperate the lines into a string array. This worked fine. Then, I replaced all the letters except for the numbers and '-' by making a pattern Pattern.compile("[^0-9]|-"); and running that for every index in the array and using .trim() to cut off the whitespace at the end and start of each string. This is all working fine, I'm getting the desired output like 6 7 and 13 16.

However, now I want to try and split this string into two. This is my code:

HashMap<Integer,Integer> numbers = new HashMap<Integer,Integer>();
    
    for(int i = 0; i < inputArray.length; i++){
        
        String [] xArray = x[i].split(Pattern.quote(" "));
        int z = Integer.valueOf(xArray[0]);
        int y = Integer.valueOf(xArray[1]);
        System.out.println(z);
        System.out.println(y);
        numbers.put(z, y);

    }
    
System.out.println(numbers);

So, first making a hasmap which will store <min, max> values. Then, the for loop (which runs 1000 times) splits every index of the 6 7 and 13 16 string into two, determined by the " ". The System.out.println(z); and System.out.println(y); are working as intended.

6
7
13
16
...

This output goes on to give me 2000 integers seperated by a line each time. That's exactly what I want. However, the System.out.println(numbers); is outputting:

{1=3, 2=10, 3=4, 4=7, 5=6, 6=9, 7=12, 8=11, 9=10, 10=18, 11=16, 12=13, 13=18, 14=16, 15=18, 16=18, 17=18, 18=19, 19=20}

I have no idea where to even start with debugging this. I made a test file with an array that is formatted like "even, odd" integers all the way up to 100. Using this exact same code (I did change the variable names), I'm getting a better output. It's not exactly desired since it starts at 350=351 and then goes to like 11=15 and continues in a non-chronological order but at least it contains all the 100 keys and values.

Also, completely unrelated question but is my formatting of the for loop fine? The extra space at the beginning and the end of the code?

Edit: I want my expected output to be something like {6=7, 13=16, 5=6, 2=4, 16=17...}. Basically, the hashmap would have the minimum and maximum as the key and value and it'd be in chronological order.


Solution

  • The problem with your code is that you're trying to put in a nail with a saw. A hashmap is not the right tool to achieve what you want, since

    • Keys are unique. If you try to input the same key multiple times, the first input will be overwritten
    • The order of items in a HashMap is undefined.
    • A hashmap expresses a key-value-relationship, which does not exist in this context

    A better datastructure to save your Passwords would probably just be a ArrayList<IntegerPair> where you would have to define IntegerPair yourself, since java doesn't have the notion of a type combining two other types.