hashmap没有读取所有输入

omtl5h9j  于 2021-07-07  发布在  Java
关注(0)|答案(2)|浏览(306)

这是aoc的第二天。输入是沿着
“6-7 z:DQZZJBZZ
13-16 j:jjvjjjjjjjjjjj
5-6米:mmbmmlvmmgmmf
2-4 k:pkkl
16-17 k:kkkkkkkkkkkkkkkqf
10-16秒:mqpscpsssssrs
..."
它的格式类似于“minmax letter:password”,并用行分隔。我应该找出有多少密码符合最低和最高要求。我把所有的提示都放到一个字符串变量中并使用 Pattern.quote("\n") 将行分隔成一个字符串数组。这很管用。然后,我把除了数字和“-”之外的所有字母都换成了一个图案 Pattern.compile("[^0-9]|-"); 对数组中的每个索引运行 .trim() 在每个字符串的结尾和开始处截断空白。这一切都很好,我得到了理想的输出像 6 7 以及 13 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,它将存储<min,max>值。然后,for循环(运行1000次)拆分 6 7 以及 13 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循环格式好吗?代码开头和结尾的额外空间?
编辑:我希望我的预期输出是 {6=7, 13=16, 5=6, 2=4, 16=17...} . 基本上,hashmap将最小值和最大值作为键和值,并按时间顺序排列。

disbfnqx

disbfnqx1#

你的代码的问题是你想用锯子把钉子钉进去。hashmap不是实现您想要的功能的合适工具,因为
钥匙是独一无二的。如果您多次尝试输入同一个键,第一个输入将被覆盖
哈希Map中项目的顺序未定义。
hashmap表示一个键值关系,在这个上下文中不存在
一个更好的数据结构来保存你的密码可能只是 ArrayList<IntegerPair> 在这里,您必须自己定义integerpair,因为java没有一个类型结合其他两个类型的概念。

1rhkuytd

1rhkuytd2#

我认为你不必要地使任务复杂化了。我将按以下步骤进行:
使用行分隔符拆分输入
对于每行,删除 : 并使用空格拆分得到长度为3的数组
在第二步中从数组生成
3.1. 数组[0]中的最小/最大字符数
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");
}

相关问题