这是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将最小值和最大值作为键和值,并按时间顺序排列。
2条答案
按热度按时间disbfnqx1#
你的代码的问题是你想用锯子把钉子钉进去。hashmap不是实现您想要的功能的合适工具,因为
钥匙是独一无二的。如果您多次尝试输入同一个键,第一个输入将被覆盖
哈希Map中项目的顺序未定义。
hashmap表示一个键值关系,在这个上下文中不存在
一个更好的数据结构来保存你的密码可能只是
ArrayList<IntegerPair>
在这里,您必须自己定义integerpair,因为java没有一个类型结合其他两个类型的概念。1rhkuytd2#
我认为你不必要地使任务复杂化了。我将按以下步骤进行:
使用行分隔符拆分输入
对于每行,删除
:
并使用空格拆分得到长度为3的数组在第二步中从数组生成
3.1. 数组[0]中的最小/最大字符数
3.2字母及其否定的字符类
3.3从密码中删除与给定字母不符的所有字母,并检查密码长度是否在规定范围内。
比如: