Как получить одинаковую позицию в двух списках массивов, если я удалил значение из первого списка массивов

#java #arraylist

#java #список массивов

Вопрос:

У меня есть два списка массивов

 ArrayList<String> firstList = new ArrayList<>(Arrays.asList("king", "king", "queen", "jack", "queen"));

ArrayList<String> secondList = new ArrayList<>(Arrays.asList("one", "one", "one", "two", "one"));
  

В списке с именем firstList я удалю дубликат с помощью Set<String> hashSet = new HashSet<>(firstList); , и результат будет "king", "queen", "jack"

Что я хочу сделать, так это получить позицию в secondList , равную позиции в firstList .

Текущий результат равен (king amp; one), (queen, one), (jack, one)

Я хочу, чтобы результат был таким (king, one), (queen, one), (jack, two)

Если бы кто-нибудь из вас мог мне помочь, я был бы очень признателен.

Комментарии:

1. Почему бы вам не удалить дубликаты и из второго списка?

2. зачем вам вообще нужен второй список? похоже, все, что вам нужно, это найти индекс элемента в первом списке / HashSet и добавить 1

3. Похоже, для этого вам не следует использовать две независимые структуры данных ( List -ы), а вместо этого Map<String, String> . Это был бы вариант?

4. упс, мои плохие неправильные значения из secondList Я отредактировал свой пост @Eran, вот почему я не могу удалить дубликат

5. Я не вижу взаимосвязи между числами во втором списке и удаленными значениями в первом. Почему «Король» и «Дама» сопоставляются с «одним», а «Валет» — с двумя??

Ответ №1:

Предполагая, что ваши два входных списка всегда имеют одинаковую длину, вы можете сделать что-то простое, например:

 public static void main(String[] args) {
    List<String> firstList  = new ArrayList<>(Arrays.asList("king", "king", "queen", "jack", "queen"));
    List<String> secondList = new ArrayList<>(Arrays.asList("one", "one", "one", "two", "one"));

    List<String> cards = new ArrayList<>();
    List<String> positions = new ArrayList<>();
    for(int i = 0; i< firstList.size(); i  ){
        String temp = firstList.get(i);
        if(!cards.contains(temp)){
            cards.add(temp); 
            positions.add(secondList.get(i)); 
        }
    }
    System.out.println(cards);
    System.out.println(positions);
}
  

Комментарии:

1. Значит, я не буду использовать HashSet для удаления повторяющихся значений?

2. Да, вы сохраняете свои входные списки firstList amp; secondList неизменными. Повторяя ваш firstList и добавляя только уникальные значения в список cards, вы создаете копию firstlist без дубликатов. И в список позиций вы добавляете элементы из secondList, которые имеют тот же индекс, что и уникальные значения в firstlist.

Ответ №2:

Используйте Map . В Java 8 это было бы (в форме прохождения модульного теста):

     final List<String> one = asList("king", "king", "queen", "jack", "queen");
    final List<String> two = asList("one", "one", "one", "two", "one");

    //Guards against IndexOutOfBoundsExceptions
    final int size = Math.min(one.size(), two.size()); 
    //LinkedHashMap to preserve key ordering
    final Map<String,String> map = new LinkedHashMap<>(size);
    for(int i = 0; i < size; i  ) {
        map.putIfAbsent(one.get(i), two.get(i));
    }

    final String actual = map.entrySet().stream()
            .map(e -> String.format("[%s,%s]", e.getKey(), e.getValue()))
            .collect(Collectors.joining(","));
    final String expected = "[king,one],[queen,one],[jack,two]";
    assertEquals(expected, actual);
  

Для Java 7 вам нужно проверить, что Map еще не содержит ключ, прежде чем добавлять его. putIfAbsent() делает это за вас в противном случае.

Вы можете передавать Map значения и ключи впоследствии, если вы хотите делать с ними разные вещи:

     final String keys = String.join(",", map.keySet());
    assertEquals("king,queen,jack", keys);

    final String values = String.join(",", map.values());
    assertEquals("one,one,two", values);
  

Комментарии:

1. Я думаю, что OP нужны два списка по индексу, я думаю, вы зашли так далеко.

2. Что, если я не хочу его объединять, я хочу установить для него два разных textview ?

3. Затем передавайте values() и keySet() независимо друг от друга (я обновлю свой ответ)

4. Спасибо, я подожду

5. String.join требуется API 26 уровня sad. Не могу использовать этот код