如何基于自定义列表对集合进行排序

时间:2017-04-13 20:33:21

标签: java algorithm scala sorting

我在Scala或Java中有许多列表。列表看起来像这样 List({cat, toronto}, {dog, vancouver}, {mouse, calgary} ... )。假设{cat,toronto}是两个字符串的对象。 我需要根据另一个标准对这些列表进行排序,这些标准也是一个列表,例如>> List(dog, cat, mouse)。如您所见,排序标准没有特定的逻辑或自然排序顺序 我知道总是可以使用蛮力方法。这就是我想要避免的。我想这样排序>> myList1.sort(listCriteria),然后是myList2.sort(listCriteria),依此类推。 有没有办法做到这一点?感谢。

3 个答案:

答案 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]