Кратчайший способ сортировки и сравнения двух списков - PullRequest
0 голосов
/ 05 февраля 2020

У меня есть два списка, один тип String, а другой тип Resp (класс модели). Я хочу отсортировать Resp, сравнивая из первого списка, например, если список строк содержит: «abc», «iis», «kjkk» , тогда такой же порядок сохраняется в списке Resp. Список Resp типа:

data class Resp(
    @SerializedName("firstname")
    val first: String,

    @SerializedName("number")
    val number: Int
})

Таким образом, сортировка должна быть выполнена с использованием Resp.first

. Я пытаюсь:

resp.sortedWith(Comparator{ s1, s2 -> 
    s1.first.compareTo(staticlist.indexOf(s2.bUName))
})

Но здесь проблема в том, что я не могу получить индекс s1.first.

Поэтому, пожалуйста, дайте какие-либо предложения, чтобы решить это

Ответы [ 2 ]

1 голос
/ 05 февраля 2020

Наиболее простым решением было бы просто перестроить список элементов Resp из того порядка, который вы собрали, путем итерации strList. Если в respList нет аналога, он не будет частью списка результатов.

val strList = listOf("abc", "iis", "kjkk") // desired order
val respList = listOf(Resp("iis"), Resp("kjkk"), Resp("abc")) // unsorted

val result = strList.flatMap { str -> 
    respList.filter { 
        it.first == str
    }
}

Результат:

[Resp (first = ab c) ), Resp (первый = iis), Resp (первый = kjkk)]

0 голосов
/ 05 февраля 2020

Я постараюсь ответить на это java. Я предполагаю, что первый список является стандартом для рассмотрения порядка списка объектов Resp. Во-первых, нам нужно отобразить этот первый список на карту строки (как ключ) и Integer (как значение заказа). И, конечно, поскольку это стандарт для порядка, значение каждой строки должно быть уникальным:

List<String> orderRaw = new LinkedList<>();
List<Resp> resps = new ArrayList<>();
Map<String, Integer> order = new HashMap<>();
for (int i = 0; i < orderRaw.size(); i++) {
  String s = orderRaw.get(i);
  order.put(s, i);
}

Затем вы можете отсортировать список объектов Resp следующим образом:

List<Resp> resps = new ArrayList<>();
resps.sort((o1, o2) -> {
  final Integer i1 = order.get(o1);
  final Integer i2 = order.get(o2);
  if (Objects.equals(i1, i2)) {    //either both null or have the same index
    return 0;
  } else if (i1 == null) {   //only i1 is null
    return -1;
  } else if (i2 == null) {   //only i2 is null
    return 1;
  } else {
    return i1 - i2;
  }
});

Надеюсь, это даст вам идею.

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