如何在Java中保持List索引的固定

Mhd*_*wan 5 java indexing collections list fixed

我想保持Java列表中项目的索引是固定的.

示例代码:

import java.util.ArrayList;
public class Test {
    public static void main(String[] args) {
        ArrayList<Double> a = new ArrayList<Double>();
        a.add(12.3);
        a.add(15.3);
        a.add(17.3);

        a.remove(1);
        System.out.println(a.get(1));
    }
}
Run Code Online (Sandbox Code Playgroud)

这将输出17.3.问题是17.3在索引2上,现在它在索引1上!

有没有办法在删除元素时保留其他元素的索引?或者是否有另一类更适合此目的?

注意:我不想要固定大小的Collection.

mae*_*ics 5

而不是打电话给a.remove(1)a.set(1, null).这将使所有元素保持在同一位置,同时仍然"删除"索引1处的值.

  • @MhdSyrwan:可能没有这样的类,因为[`List #remove(int)`]的语义(http://docs.oracle.com/javase/6/docs/api/java/util/List.html# remove(int))要求实现"将任何后续元素移到左侧". (2认同)

小智 5

您可能需要使用java.util.SortedMapint键:

import java.util.*;
public class Test {

    public static void main(String[] args) 
    {
        SortedMap<Integer, Double> a = new TreeMap<Integer, Double>();
        a.put(0, 12.3);
        a.put(1, 15.3);
        a.put(2, 17.3);

        System.out.println(a.get(1)); // prints 15.3
        System.out.println(a.get(2)); // prints 17.3

        a.remove(1);

        System.out.println(a.get(1)); // prints null
        System.out.println(a.get(2)); // prints 17.3
    }
}
Run Code Online (Sandbox Code Playgroud)
  • SortedMap 是一个可变大小的集合
  • 它存储映射到有序键集的值(类似于List索引)

java.util.List#remove(int)自规范读取以来,没有任何实现可以保留索引:

删除此列表中指定位置的元素(可选操作).将任何后续元素向左移位(从索引中减去一个).返回从列表中删除的元素.