Java ArrayList сортирует два списка в одном порядке - PullRequest
3 голосов
/ 27 марта 2019

У меня есть два ArrayLists в Java.Оба списка не отсортированы.

    ArrayList<Integer> listOne = new ArrayList<>();
    listOne.add(2);
    listOne.add(1);
    listOne.add(4);
    listOne.add(8);
    listOne.add(6);

    ArrayList<String> listTwo = new ArrayList<>();
    listTwo.add("ant");
    listTwo.add("bear");
    listTwo.add("cat");
    listTwo.add("dog");
    listTwo.add("zebra");

Я хочу отсортировать listOne в естественном порядке, и каждый элемент спискаTwo должен быть отсортирован в соответствии с положением в listOne:

То, что у меня пока есть:

  Collections.sort(listOne);

  for (int i = 0; i < listOne.size(); i++) {

        int intTest = listOne.get(i);
        String stringTest = listTwo.get(i);

        System.out.println(intTest);
        System.out.println(stringTest);

    }

Это печатает:

  1 ant, 2 bear, 4 cat , 6 dog , 8 zebra

Мой ожидаемый вывод на печать:

  1 bear, 2 ant, 4 cat, 6 zebra, 8 dog

Так что, когда элемент listOne "1", это изменило положение со 2-го на 1-еэлемент «медведь» в списке listwo, который был на 2-й позиции, должен также печататься на 1-й позиции.

Какой самый простой и эффективный способ сделать это?

Ответы [ 5 ]

3 голосов
/ 27 марта 2019

Создать упорядоченный список индексов:

int n = listOne.size();
assert n == listTwo.size();

Integer[] indices = new Integer[n];
for (int i = 0; i < n; ++i) {
  indices[i] = i;
}

Сортируйте этот список с помощью компаратора, который сравнивает индексы, просматривая соответствующие элементы в listOne.

Arrays.sort(
    indices,
    new Comparator<Integer>() {
      public int compare(Integer a, Integer b) {
        return listOne.get(a).compareTo(listOne.get(b));
      }
    });

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

static <T> void reorder(Integer[] indices, List<T> mutatedInPlace) {
  List<T> tempSpace = new ArrayList<T>(indices.length);
  for (int index : indices) {
    tempSpace.add(mutatedInPlace.get(index);
  }
  mutatedInPlace.clear();
  mutatedInPlace.addAll(tempSpace);
}

reorder(indices, listOne);
reorder(indices, listTwo);
2 голосов
/ 27 марта 2019

TreeMap лучше всего подходит для этой ситуации. Он вставляет данные в отсортированном порядке, поэтому в основном храните ключ, и напротив каждого ключа вы можете хранить животное.

Map<Integer,String> sortedMap = new TreeMap<Integer,String>();
sortedMap.push(listOne.get(i),listTwo.get(listOne.get(i)));

Если вы хотите придерживаться ArrayList, вы можете перебрать listOne и вставить его в HashMap<Integer,String>

iterate over list (for example i)
map.put( listOne.get(i), secondList.get(i));

Таким образом, хэш-карта будет выглядеть как (2, "ant");

  • Collections.sort (Listone);
  • Против каждой записи вы можете получить соответствующего животного с карты
1 голос
/ 27 марта 2019

Мы можем использовать структуру данных HashMap, она содержит пары «ключ-значение» и позволяет получить значение по ключу.

int i = 0;
Map<Integer, Integer> map = new HashMap<Integer, Integer>();

Здесь мы храним элементы из listOneв качестве ключей и их положение в качестве значения в HashMap.

for (Integer num : listOne) {
        map.put(num, i);
        i++;
    }

Мы печатаем элементы из listTwo в соответствии с элементами из listOne, изменивших свою позицию.

Collections.sort(listOne);
    for (Integer num : listOne) {
        System.out.println(num + " " + listTwo.get(map.get(num)));
    }

Одно решение:

    int i = 0;
    Map<Integer, Integer> map = new HashMap<Integer, Integer>();
    for (Integer num : listOne) {
        map.put(num, i);
        i++;
    }
    Collections.sort(listOne);
    for (Integer num : listOne) {
        System.out.println(num + " " + listTwo.get(map.get(num)));
    }

Вывод:

1 медведь, 2 муравья, 4 кошки, 6 зебр, 8 собак

1 голос
/ 27 марта 2019

Если вы используете Map<Integer, String> для этого, вам даже не нужно сортировать его, если вы берете реализацию TreeMap.

В основном это работает следующим образом:

public class StackoverflowMain {

    public static void main(String[] args) {
        // initialize a map that takes numbers and relates Strings to the numbers
        Map<Integer, String> animals = new TreeMap<Integer, String>();
        // enter ("put" into the map) the values of your choice
        animals.put(2, "ant");
        animals.put(1, "bear");
        animals.put(4, "cat");
        animals.put(8, "dog");
        animals.put(6, "zebra");
        // print the whole map using a Java 8 forEach statement
        animals.forEach((index, name) -> System.out.println(index + ": " + name));
    }

}

Этот код выведет

1: bear
2: ant
4: cat
6: zebra
8: dog
0 голосов
/ 28 марта 2019

Объединяя предложения всех дружелюбных и полезных людей (плюс некоторые другие исследования и тесты), вот последний код, который я придумал:

ArrayList<String> listOne = new ArrayList<>();
listOne.add("one");
listOne.add("eight");
listOne.add("three");
listOne.add("four");
listOne.add("two");

ArrayList<String> listTwo = new ArrayList<>();
listTwo.add("ant");
listTwo.add("bear");
listTwo.add("cat");
listTwo.add("dog");
listTwo.add("zebra");

Map<String, String> sortedMap = new TreeMap<String, String>();

for (int i = 0; i < listOne.size(); i++) {

    String stringkey = listOne.get(i);
    String stringValue = listTwo.get(i);

    sortedMap.put(stringkey, stringValue);
}

print output = {eight=bear, four=dog, one=ant, three=cat, two=zebra}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...