【问题标题】:Hashmap in for loop not reading all the inputfor循环中的Hashmap未读取所有输入
【发布时间】:2020-12-02 19:17:45
【问题描述】:

这是针对 AOC 第 2 天的。输入内容类似于

"6-7 z: dqzzzjbzz

13-16 j: jjjvjmjjkjjjjjjj

5-6米:mmbmmlvmbmmgmmf

2-4 k: pkkl

16-17 k: kkkkkkkkkkkkkkkqf

10-16 秒:mqpscpsszscsssrs

..."

它的格式类似于“最小最大字母:密码”并以行分隔。我应该找出满足最低和最高要求的密码数量。我将所有提示放入一个字符串变量中,并使用Pattern.quote("\n") 将这些行分隔成一个字符串数组。这工作得很好。然后,我通过创建一个模式Pattern.compile("[^0-9]|-"); 并为数组中的每个索引运行它并使用.trim() 切断每个字符串末尾和开头的空格,替换了除数字和“-”之外的所有字母。这一切都很好,我得到了像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 循环格式是否正确?代码开头和结尾的多余空格?

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

【问题讨论】:

  • 代码拼图输入的出现因用户而异,因此您的链接无法帮助其他人了解您正在使用的输入。我最初的猜测是,您的输入可能包含每个 z 值的多个副本,因此您稍后遇到的一对 (6=9) 会覆盖您添加的以 (6=7) 开头的对。但如果没有看到输入,我无法验证这一点。
  • 您应该提供问题或简短摘要以及示例输入和预期输出。您发布的链接仅供登录用户使用。

标签: java for-loop hashmap


【解决方案1】:

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

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

保存密码的更好数据结构可能只是 ArrayList&lt;IntegerPair&gt;,您必须自己定义 IntegerPair,因为 java 没有组合其他两种类型的类型的概念。

【讨论】:

    【解决方案2】:

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

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

    2. 对于每一行删除: 并使用空格分割以获得长度为3的数组

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

    【讨论】:

      猜你喜欢
      • 2013-08-28
      • 2016-02-22
      • 1970-01-01
      • 1970-01-01
      • 2021-10-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-02
      相关资源
      最近更新 更多