在java中操纵arraylist的部分

时间:2012-04-23 15:43:11

标签: java arraylist resize

我有以下问题。

我有一个大行和列维度的 W 矩阵。每行代表特征值(用双值填充)。矩阵构造为:

  Hashmap<Integer,Arraylist<Double>> W = new Hashmap<Integer,Arraylist<Double>>();

在进行计算时,我需要获取每行的某些部分并以矩阵形式更新它们。我在subList中查找了Arraylist方法。但问题是 它只返回列表,但我需要arraylist。因为我已经实现的许多方法都作为参数。那么这个案例的解决方案是什么呢?

实施例

 w1 = [1,3 ,4,6,9,1,34,5,21,5,2,5,1]
 w11 = [1,3,4]
 w11 = w11 +1 = [2,4,5]
 This changes w1 to = [2,4 ,5,6,9,1,34,5,21,5,2,5,1]

2 个答案:

答案 0 :(得分:5)

  

我在Arraylist中查找了subList方法。但问题是它只返回列表但我需要arraylist

这根本不是问题。实际上,您应该将代码更改为尽可能使用List

List是具体类型的接口,例如ArrayList实现。以下是完全有效的:

List<String> list = new ArrayList<String>();
list.add("hello");
list.add("world");

我建议您将W更改为:

Hashmap<Integer, List<Double>> W = new Hashmap<Integer, List<Double>>();

答案 1 :(得分:1)

您可以将ArrayList子类化,以提供另一个ArrayList切片的视图。像这样:

class ArrayListSlice<E> extends ArrayList<E> {
  private ArrayList<E> backing_list;
  private int start_idx;
  private int len;
  ArrayListSlice(ArrayList<E> backing_list, int start_idx, int len) {
    this.backing_list = backing_list;
    this.start_idx = start_idx;
    this.len = len;
  }
  public E get(int index) {
    if (index < 0 || idx >= len) throw new IndexOutOfBoundsException();
    return backing_list.get(start_idx + index);
  }
  ... set, others? ...
}

然后你可以w11 = new ArrayListSlice<Double>(w1, 0, 3)。假设您正确实施w11w1上的所有操作都会显示在set中。

您可能需要实现ArrayList的大多数方法才能使其工作。如果他们只依赖别人,有些人可能会工作,但这很难从规范中得知。