0

(我是 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 中的下一个整数)并将 2 放入 count[2],这也是合理的。 此时,data1中的下一个数字使得idx = 3,但它出现在ArrayList中的索引2处,所以它应该在count[3]中放入3,这是不正确的。

那么,.get 和 .set 在这里做什么呢?他们完成后是否将元素从列表中弹出?我忽略了什么吗?

4

3 回答 3

0

A.get()不会自动从List没有那么多元素的 a 中获取元素。注意:列表索引,如数组,从 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。Lists (这是 a 的实现Collection),但是,是。但是您必须附加到它们。

那么,这条线的作用是:

count.set(idx, count.get(idx) + 1);

取 index 处的值idx,将其加 1,然后将该值设置回同一索引处。

于 2013-06-21T22:40:09.833 回答
0

您当前正在使用ArrayList,它的作用类似于数组,但更容易扩展它 - 例如,向其中添加元素。

您想要的是 java 中的 python 等价物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);
}
于 2013-06-21T22:39:42.410 回答
0

在您的特定情况下,您正在寻找的是一个稀疏数组。在 Java 中,我们使用 aHashMap<Integer, Integer>来达到这个目的。您不需要任何零初始化,但您确实需要检查null

final Integer curr = count.get(idx);
count.put(idx, curr == null? 1 : curr+1);
于 2013-06-21T22:43:48.823 回答