我在Scala或Java中有许多列表。列表看起来像这样
List({cat, toronto}, {dog, vancouver}, {mouse, calgary} ... )
。假设{cat,toronto}是两个字符串的对象。
我需要根据另一个标准对这些列表进行排序,这些标准也是一个列表,例如>> List(dog, cat, mouse)
。如您所见,排序标准没有特定的逻辑或自然排序顺序
我知道总是可以使用蛮力方法。这就是我想要避免的。我想这样排序>> myList1.sort(listCriteria)
,然后是myList2.sort(listCriteria)
,依此类推。
有没有办法做到这一点?感谢。
答案 0 :(得分:5)
我不确定我是否理解这个问题,但您似乎只想将键列表映射到键值对列表。像
val in = List(("cat", "toronto"), ("dog", "vancouver"), ("mouse", "calgary"))
val dict = in.toMap
def sort(keys: List[String]): List[(String, String)] =
keys.map(key => key -> dict(key))
sort(List("dog", "cat", "mouse"))
res3: List[(String, String)] = List((dog,vancouver), (cat,toronto), (mouse,calgary))
答案 1 :(得分:1)
您可以创建一个HashMap
,将每个字符串从标准列表映射到其位置,然后创建一个比较器,从HashMap
获取值并进行比较。这样,比较需要O(1)
时间(平均)。
答案 2 :(得分:0)
您可以创建一个比较器/ lambda表达式,用于在第二个列表中按索引比较元素。这是一个普通的Java方法:
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class MapSort {
private static class MyObject {
final String first;
final String second;
public MyObject(String first, String second) {
this.first = first;
this.second = second;
}
@Override
public String toString() {
return this.first + "/" + this.second;
}
}
public static void main(String[] args) {
List<String> desiredOrder = Arrays.asList("dog", "cat", "mouse");
List<MyObject> listToBeSorted = new ArrayList<>();
listToBeSorted.add(new MyObject("cat", "toronto"));
listToBeSorted.add(new MyObject("dog", "vancouver"));
listToBeSorted.add(new MyObject("mouse", "calgary"));
System.out.println(listToBeSorted);
listToBeSorted.sort((o1, o2) -> desiredOrder.indexOf(o1.first) - desiredOrder.indexOf(o2.first));
System.out.println(listToBeSorted);
}
}
输出:
[cat/toronto, dog/vancouver, mouse/calgary]
[dog/vancouver, cat/toronto, mouse/calgary]