#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. Не могу использовать этот код