排序两个列表

时间:2014-08-28 15:08:29

标签: java algorithm sorting

我在Java工作。我有两个列表,让我们称它们为A和B,我想对它进行排序。 A是整数列表,所以我没有问题。我只是使用Collections.sort()来获取整数的排序列表。 列表B出现问题。我想在A之前进行之前完成的相同更改。。 B是对象列表,但没有办法将B中的更改与A中的更改相关联。我的意思是,没有创建比较器方法的条件

小例子:

我有:

A -> {5,1,3,6,4}
B -> {a,b,c,d,e}

我想对A进行排序并对B应用相同的更改以获取:

A -> {1,3,4,5,6}
B -> {b,c,e,a,d}

有没有办法使用内置的Java函数?由于效率的原因,我宁愿避免自己编写排序算法。 谢谢!

5 个答案:

答案 0 :(得分:3)

我首先要创建一个POJO来存储AB

static class ABPojo implements Comparable<ABPojo> {
    public ABPojo(int a, String b) {
        this.a = a;
        this.b = b;
    }

    private int a;
    private String b;

    public int getA() {
        return a;
    }

    public String getB() {
        return b;
    }

    public int compareTo(ABPojo o) {
        if (o instanceof ABPojo) {
            ABPojo that = (ABPojo) o;
            return Integer.valueOf(a).compareTo(that.getA());
        }
        return 1;
    }
}

然后,您可以在排序后循环遍历ABPojo(s)的集合,以使用类似

的内容构建输出
public static void main(String[] args) {
    List<ABPojo> al = new ArrayList<ABPojo>();
    al.add(new ABPojo(5, "a"));
    al.add(new ABPojo(1, "b"));
    al.add(new ABPojo(3, "c"));
    al.add(new ABPojo(6, "d"));
    al.add(new ABPojo(4, "e"));
    Collections.sort(al);
    StringBuilder a = new StringBuilder();
    StringBuilder b = new StringBuilder();
    for (ABPojo pojo : al) {
        if (a.length() > 0) {
            a.append(",");
        } else {
            a.append("{");
        }
        if (b.length() > 0) {
            b.append(",");
        } else {
            b.append("{");
        }
        a.append(pojo.getA());
        b.append(pojo.getB());
    }
    a.append("}");
    b.append("}");
    System.out.println("A -> " + a.toString());
    System.out.println("B -> " + b.toString());
}

输出是请求的

A -> {1,3,4,5,6}
B -> {b,c,e,a,d}

答案 1 :(得分:3)

TreeMap将始终以正确的顺序迭代键,因此您可以这样做:

 Map<Integer, String> map = new TreeMap<Integer, String>();
 map.put(5, "a");
 map.put(1, "b");
 map.put(3, "c");
 map.put(6, "d");
 map.put(4, "e");
 System.out.println(map.keySet());
 System.out.println(map.values());

但是,如果你真的想以同一对List个实例开始和结束,我认为你必须做一些像这样的错综复杂的事情:

 List<Integer> numbers = new ArrayList<Integer>(Arrays.asList(5, 1, 3, 6, 4));
 List<String> letters = new ArrayList<String>(Arrays.asList("a", "b", "c", "d", "e"));
 Map<Integer, String> map = new HashMap<Integer, String>();
 for (int i = 0, n = numbers.size(); i < n; i++) {
     map.put(numbers.get(i), letters.get(i));
 }
 Collections.sort(numbers);
 letters.clear();
 for (int number : numbers) {
     letters.add(map.get(number));
 }
 System.out.println(numbers);
 System.out.println(letters);

答案 2 :(得分:1)

创建一个map,其中A中的元素为key,B中的元素为value。 然后Collections.Sort()将自动对A元素及其相应的B元素进行排序。

答案 3 :(得分:0)

从这里开始:

How to find the permutation of a sort in Java

然后手动应用排列。

但这听起来像是一个设计问题;考虑一个实现Comparator<T>的类列表,其中比较函数只是在数字上。

答案 4 :(得分:0)

我认为没有Java功能可以做到这一点。

但是,您可以使用映射结构而不是列表结构,其中数据的键是您的int,并且数据是不可排序的列表。