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 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 来存储 值。然后,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 循环的格式是否正确?代码开头和结尾多出来的space?
编辑:我希望我的预期输出类似于 {6=7, 13=16, 5=6, 2=4, 16=17...}
。基本上,hashmap 将以最小值和最大值作为键和值,并且按时间顺序排列。
我认为您不必要地使任务复杂化。我将按如下方式进行:
使用行分隔符拆分输入
为每一行删除 :
并使用空格拆分以获得长度为 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 没有结合两种其他类型的类型的概念.
这是 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 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 来存储 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 循环的格式是否正确?代码开头和结尾多出来的space?
编辑:我希望我的预期输出类似于 {6=7, 13=16, 5=6, 2=4, 16=17...}
。基本上,hashmap 将以最小值和最大值作为键和值,并且按时间顺序排列。
我认为您不必要地使任务复杂化。我将按如下方式进行:
使用行分隔符拆分输入
为每一行删除
的数组:
并使用空格拆分以获得长度为 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 没有结合两种其他类型的类型的概念.