Как изменить положение клавиш по порядку номеров на карте Java? - PullRequest
1 голос
/ 03 августа 2020

Я пытаюсь удалить определенный ключ с карты и изменить положение всех ключей по индексу. Например: Моя карта похожа на Карта

0,"A"
1,"B"
2,"C"
3,"D"

если я удалю ключ 1, то вывод должен быть

0,"A"
1,"C"
2,"D"

Как сохранить ключи в индексе (от 0 до размера-1) и присвоить следующее значение предыдущий ключ после удаления?

Это необходимо, потому что перед вставкой в ​​карту мне нужно проверить, существует ли ключ или нет. Этот сценарий требуется для моего адаптера представления ресайклера для хранения уникальных позиций, чтобы избежать перезагрузки элементов, если они есть на карте

Ответы [ 5 ]

2 голосов
/ 03 августа 2020

В вашей ситуации, если вы хотите, чтобы индекс имел такое поведение. Map - это не ответ. используйте List - можно использовать ArrayList [вставка часто] или LinkedList [быстро при чтении].

Пример:

List<String> items = new ArrayList<>();

items.add("A");
items.add("B");
items.add("C");
items.add("D");

Итак, если вы удалите индекс 1 или B ;

items.remove(1);

Индекс C автоматически будет равен 1. Как вы и хотели выше.

0 голосов
/ 03 августа 2020

вы выбираете очень плохой способ реализовать это в адаптере, но вы можете решить его с помощью приведенного ниже кода:

 final Map<Integer, String> myStupidMap = new HashMap<>();
    myStupidMap.put(1, "A");
    myStupidMap.put(2, "B");
    myStupidMap.put(3, "C");
    myStupidMap.put(4, "D");

    final int[] count = {0};
    if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.N) {
        myStupidMap.forEach(new BiConsumer<Integer, String>() {
            @Override
            public void accept(Integer integer, String s) {
                if (count[0] == 1){
                    myStupidMap.remove(integer);
                }
                count[0]++;
            }
        });
    }

Надеюсь, это будет полезно для вас, но мое предложение не использовать карта.

0 голосов
/ 03 августа 2020

TreeMap<K,V> в пакете jdk java.util может удовлетворить ваши потребности. Какой бы ключ вы ни удалили, сортировка никогда не изменится.

Если вы хотите определить собственный метод сортировки, просто используйте его собственный comparator, чтобы перезаписать метод построения TreeMap(Comparator<? super K> comparator) для достижения сортировки ключей.

public static void main(String[] args) {  
    Map<Integer, String> map = new TreeMap<Integer, String>();  
    map.put(0, "A");
    map.put(1, "B");
    map.put(2, "C");
    map.put(3, "D");
    // whatever key you delete , the sort will not change...
    for (Map.Entry<Integer, String> entry : resultMap.entrySet()) {  
        System.out.println(entry.getKey() + " " + entry.getValue());  
    }  
}  

0 голосов
/ 03 августа 2020

Нельзя упорядочить ключи при удалении путем обновления значений ключей. В MAP единственный способ обновить ключи - это удалить ключ и снова вставить его с новым значением. Это сложно и дорого. Вы можете go с ArrayList для желаемого результата, как предлагается.

0 голосов
/ 03 августа 2020

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

Похоже, вам может быть лучше использовать List вместо Map.

ArrayList<String> strings = new ArrayList(Arrays.asList("A", "B", "C"));
// 0 => "A", 1 => "B", 2 => "C"
strings.remove(1);
// 0 => "A", 1 => "C"
...