(我是Java新手,来自Python ---)
我正在阅读一个教程,他们已经创建了一个程序来计算一个数字出现在文件中的次数,然后返回该数字。程序的一个特定部分对我来说有点神秘,并处理ArrayList的.get和.set(方法?函数?)。该计划如下:
// (Scan a file with the numbers, say, 2 2 3 4, and put it into data1 variable.)
// (Make An Empty ArrayList with a bunch of 0's)
Scanner data1 = null;
ArrayList<Integer> count = new ArrayList<Integer>();
Integer idx;
while(data1.hasNextInt()){
idx = data1.nextInt();
System.out.println(idx);
System.out.println(count.get(idx)+1);
count.set(idx,count.get(idx)+1);
}
//Then prints out all the values; the ArrayList contains the number of times the number n occurs in the n-th index.
我的问题出现在“while”部分。具体来说,假设data1的数字为2 2 3 4.似乎它需要idx = 2,然后在count [2]中加1,这是合理的。然后它再次获取idx = 2(data1中的下一个整数)并在count [2]中放置2,这也是合理的。 此时,data1中的下一个数字使得idx = 3,但是它出现在ArrayList的索引2处,因此它应该在count [3]中放置3,这是不正确的。
那么,.get和.set在这做什么?当它们完成后,它们会从列表中弹出元素吗?我忽略了什么吗?
答案 0 :(得分:0)
您当前正在使用ArrayList
,它的作用类似于数组,但可以更轻松地扩展它 - 例如,向其中添加元素。
你想要的是java中的等价的dict
,一个键/值存储,在java中,这被称为HashMap<K,V>
(docs)。
Scanner data1 = null;
HashMap<Integer, Integer> count = new HashMap<Integer, Integer>();
Integer idx;
while(data1.hasNextInt()) {
idx = data1.nextInt();
System.out.println(idx);
Integer g = count.get(idx)+1;
if(g == null) {
g = 0;
}
g++;
System.out.println(g);
count.put(idx, g);
}
答案 1 :(得分:0)
.get()
不会自动从List
获取没有那么多元素的元素。注意:列表索引(如数组)从0开始。
如果你这样做:
final List<Integer> = new ArrayList<Integer>();
list.get(0);
这是运行时错误(IndexOutOfBoundsException
),因为您的列表没有元素。
你必须填写它:
list.add(1); // append an element
list.get(0); // returns element at index 0
list.get(1); // IndexOutOfBoundsException!
.set()
方法在参数处获取索引和值。同样,除了在列表的最后,你不能设置一个尚不存在的元素:
// start from an empty list
list.set(1, 32); // IndexOutOfBoundsException!
list.set(0, 32); // OK
最后注意:尽量不要使用list[i]
,括号索引用于数组;)请注意,数组在Java中不 resizabe。但是,List
(它是Collection
的实现)。但你必须追加他们。
那么,这一行是做什么的:
count.set(idx, count.get(idx) + 1);
取索引idx
的值,加1,并将该值设置为相同的索引。
答案 2 :(得分:0)
在您的具体情况下,您要查找的是稀疏数组。在Java中,我们使用HashMap<Integer, Integer>
来实现此目的。您不需要使用零进行任何初始化,但确实需要检查null
:
final Integer curr = count.get(idx);
count.put(idx, curr == null? 1 : curr+1);