Как сохранить фиксированный индекс списка в Java - PullRequest
5 голосов
/ 16 декабря 2011

Я хочу сохранить фиксированные индексы элементов в списке 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));
    }
}

Это выдаст 17.3.Проблема в том, что 17.3 был в индексе 2, а теперь в индексе 1!

Есть ли способ сохранить индексы других элементов при удалении элемента?Или есть другой класс, более подходящий для этой цели?

Примечание: я не хочу коллекцию фиксированного размера.

Ответы [ 6 ]

5 голосов
/ 16 декабря 2011

Возможно, вы захотите использовать java.util.SortedMap с клавишами int:

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
    }
}
  • SortedMap - коллекция переменного размера
  • Хранит значения, сопоставленные с упорядоченным набором ключей (аналогично индексам List)

Нет реализации java.util.List#remove(int) может сохранить индексы, поскольку в спецификации указано:

Удаляет элемент в указанной позиции в этом списке (необязательная операция). Смещает любые последующие элементы влево (вычитает один из их индексов). Возвращает элемент, который был удален из списка.

5 голосов
/ 16 декабря 2011

Вместо звонка a.remove(1) вы можете сделать a.set(1, null).Это сохранит все элементы в одном месте, в то же время «удаляя» значение из индекса один.

4 голосов
/ 16 декабря 2011

Если отношение между индексом и значением должно быть всегда одинаковым, используйте java.util.Map.

2 голосов
/ 16 декабря 2011

Вы можете использовать HashMap<Integer, Double>.Вы можете добавлять элементы, используя

myMap.put(currentMaximumIndex++, myDoubleValue);

Таким образом, индексы будут уникальными, если вам понадобится разреженное хранилище, у вас все будет в порядке, а удаление значения не повредит существующим.

2 голосов
/ 16 декабря 2011

Вместо удаления элемента с помощью вызова delete установите для элемента значение null:

т.е.:

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.set(1, null);
        System.out.println(a.get(1));
    }
}
1 голос
/ 03 июля 2014

В дополнение к вышеприведенному ответу также предлагается использовать LinkedHashMap<Integer,Double> вместо обычного Hashmap. Это сохранит порядок, в котором вы вставляете элемент.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...