令人困惑的是关于ArrayList中的.get和.set

时间:2013-06-21 22:32:23

标签: java

(我是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在这做什么?当它们完成后,它们会从列表中弹出元素吗?我忽略了什么吗?

3 个答案:

答案 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);