排序和比较两个列表的最短方法

问题描述 投票:0回答:2

我有两个列表,一个列表为String类型,另一个列表为Resp(模型类)。我想通过与第一个列表进行比较来对Resp进行排序,例如字符串列表包含以下内容:“ abc”,“ iis”,“ kjkk”然后在Resp list中保持相同的顺序。类型的Resp列表:

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

因此要使用Resp.first进行排序

我正在尝试的是:

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

但是这里的问题是我无法获得s1.first的索引。

因此,请提出任何建议以解决此问题

java android kotlin
2个回答
0
投票

我将尝试用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;
  }
});

希望它能为您提供想法。


0
投票

最简单的解决方案是按照迭代strList所收集的顺序重建Resp元素的列表。如果respList中没有副本,它将不属于结果列表。

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

val result = strList.mapNotNull { str -> 
    respList.firstOrNull { 
        it.first == str
    }
}

结果:

[Resp(first = abc),Resp(first = iis),Resp(first = kjkk)]

© www.soinside.com 2019 - 2024. All rights reserved.