2014-08-28 109 views
0

我正在使用Java。我有两个列表,我们称他们为A和B,我想分类。 A是一个整数列表,所以我没有问题要这样做。我只是使用Collections.sort()来获得排序的整数列表。 问题出现在列表B中。我想使与之前在A.中所做的相同更改。 B是一个对象列表,但是没有办法将B中的变化与A中的变化相关联。我的意思是,没有条件创建比较器方法排序两个列表

小例子:

我:

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

我想排序并应用相同的更改到B获得:

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

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

+6

为什么他们在单独的数据结构?如果按键排序,看起来像一个“TreeMap”会更好地为您服务。 – 2014-08-28 15:10:13

+0

你为什么不使用地图并将它们存储为一对? – Adi 2014-08-28 15:10:19

+1

无论何时您试图将相同的变异应用于多个数据结构,您都有自己的设计气味。与所有其他评论所说的一样,创建一个数据结构,其中包含您需要的所有数据元素并创建它们的单个列表。的 – azurefrog 2014-08-28 15:12:33

回答

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实例的结束,我想你” d必须做这样的事情:

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); 
+0

最后我没有使用这个代码,而是一个非常相似的代码,使用这个概念。指出是正确的; D – VictorSeven 2014-08-28 15:59:13

+2

谢谢。我应该指出,如果有任何重复的数字,我的答案都不会起作用。由于这个问题,最好的解决方案是@Elliott Frisch使用列表。 – 2014-08-28 23:53:47

+0

谢谢,我会考虑它。然而,在这种情况下,我没有重复的数字,我更喜欢这种方法 - 这比创建列表' – VictorSeven 2014-08-29 14:13:55

0

我不认为有一个Java函数可以做到这一点。

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

1

创建一个map与您在A的元素为key和B中的元素为value resp。 然后Collections.Sort()会自动对A元素及其对应的B元素进行排序。

+0

我喜欢这个,看起来很简单。但我做的不好。让我们看看,我正在'for'循环中使用'map.put(a.get(i),b.get(i))'初始化Map。这很好。但是我不能在地图上使用'Collections.sort()'。我试图查看地图方法,没有方法返回列表进行排序。 – VictorSeven 2014-08-28 15:34:40

+0

我在互联网上发现了一些东西,请查看[这里](http://beginnersbook.com/2013/12/how-to-sort-hashmap-in-java-by-keys-and-values/)。我认为这就是你要找的 – deejay 2014-08-28 16:27:53

+0

是的,这与Frisch的建议差不多。谢谢! – VictorSeven 2014-08-28 19:19:12

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; 
    } 
} 

然后你可以排序建立的东西你的输出像

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()); 
} 
后遍历的 ABPojo(S)集合

输出是请求的

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