for循环中的哈希图未读取所有输入

Hashmap in for loop not reading all the input

这是 AOC 第 2 天的内容。输入内容与

类似

"6-7 z: dqzzzjbzz

13-16 岁: jjjvjmjjkjjjjjjj

5-6 米:mmbmmlvmbmmgmmf

2-4k: pkkl

16-17 岁:kkkkkkkkkkkkkkkqf

10-16 秒:mqpscpsszscsssrs

...

它的格式类似于 'min-max letter: password' 并以行分隔。我应该找出有多少密码满足最低和最高要求。我将所有提示放入一个字符串变量中,并使用 Pattern.quote("\n") 将行分隔成一个字符串数组。这很好用。然后,我通过为数组中的每个索引制作一个模式 Pattern.compile("[^0-9]|-"); 和 运行 并使用 .trim() 切断白色 space 在每个字符串的结尾和开头。这一切都很好,我得到了想要的输出,比如 6 713 16.

但是,现在我想尝试将这个字符串一分为二。这是我的代码:

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

所以,首先制作一个 hasmap 来存储 值。然后,for 循环(运行 1000 次)将 6 713 16 字符串的每个索引拆分为两个,由 " " 确定。 System.out.println(z);System.out.println(y); 正在按预期工作。

6
7
13
16
...

此输出继续给我 2000 个整数,每次用一行分隔。这正是我想要的。但是,System.out.println(numbers); 正在输出:

{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}

我什至不知道从哪里开始调试它。我制作了一个测试文件,其中包含一个格式类似于“偶数、奇数”整数的数组,一直到 100。使用完全相同的代码(我确实更改了变量名称),我得到了更好的输出。这并不是我们想要的,因为它从 350=351 开始,然后变成 11=15 并以非时间顺序继续,但至少它包含所有 100 个键和值。

此外,完全不相关的问题但是我对 for 循环的格式是否正确?代码开头和结尾多出来的space?

编辑:我希望我的预期输出类似于 {6=7, 13=16, 5=6, 2=4, 16=17...}。基本上,hashmap 将以最小值和最大值作为键和值,并且按时间顺序排列。

我认为您不必要地使任务复杂化。我将按如下方式进行:

  1. 使用行分隔符拆分输入

  2. 为每一行删除 : 并使用空格拆分以获得长度为 3

    的数组
  3. 从第二步中的数组构建

    3.1。 array[0]

    中的 min/max 个字符数

    3.2 字符 类 字母及其否定

    3.3 从密码中删除所有与给定字母不对应的字母,并检查密码长度是否在范围内。

类似于:

public static void main(String[] args){   
    String input =  "6-7 z: dqzzzjbzz\n" +
                    "13-16 j: jjjvjmjjkjjjjjjj\n" +
                    "5-6 m: mmbmmlvmbmmgmmf\n" +
                    "2-4 k: pkkl\n" +
                    "16-17 k: kkkkkkkkkkkkkkkqf\n" +
                    "10-16 s: mqpscpsszscsssrs\n";
    int count = 0;
    for(String line : input.split("\n")){
        String[] temp = line.replace(":", "").split(" ");         //[6-7, z, dqzzzjbzz]
        String minMax = "{" + (temp[0].replace('-', ',')) + "}";  //{6,7}
        String letter = "[" + temp[1] + "]";                      //[z]
        String letterNegate = "[^" + temp[1] + "]";               //[^z]       
        if(temp[2].replaceAll(letterNegate, "").matches(letter + minMax)){
            count++;
        }
    }
    System.out.println(count + "passwords are valid");
}

您的代码存在问题,您正试图用锯子钉钉子。哈希图不是实现您想要的目标的正确工具,因为

  • 密钥是唯一的。如果您尝试多次输入同一个键,第一次输入将被覆盖
  • HashMap 中项目的顺序未定义。
  • hashmap 表示键值关系,在此上下文中不存在

一个更好的数据结构来保存你的密码可能只是一个 ArrayList<IntegerPair> 你必须自己定义 IntegerPair,因为 java 没有结合两种其他类型的类型的概念.