2017-09-24 69 views
0

我正在寻找一个数据结构我可以存储一对IntegerString
我可以排序两次:一次按整数降序排列并通过词汇顺序一次。寻找一个可排序数据结构的建议

我也希望能够动态地添加一对。

例如:{(13,a)(12,d) (9,a)}

排序号:{(13, a) (12, d) (9,a)}

排序词汇顺序:{(9, a) (13, a) (12, d)}

什么你有什么建议?

回答

0

既然你想存储一个订单的事情列表,我建议使用List

,这List是要存储的类型是IntegerStringPair,它是这样定义的:

class IntegerStringPair { 
    private int integer; 
    private String string; 

    public int getInteger() { 
     return integer; 
    } 

    public String getString() { 
     return string; 
    } 

    public IntegerStringPair(int integer, String string) { 
     this.integer = integer; 
     this.string = string; 
    } 
} 

你的名单将被宣布这样的:

List<IntegerStringPair> list = new ArrayList<>(); 

对列表进行排序,你可以做到这些:

// by integer 
list.sort((x, y) -> Integer.compare(x.getInteger(), y.getInteger())); 
// by string lexically 
list.sort((x, y) -> x.getString().compareTo(y.getString())); 
1

创建班级Pair持有一个整数和一个字符串:

public class Pair { 
    private Integer num; 
    private String text; 

    public Pair(Integer num, String text) { 
     this.num = num; 
     this.text = text; 
    } 

    public Integer getNum() { return num; } 
    public String getText() { return text; } 
} 

List<Pair> list = new ArrayList<>(); 
list.add(new Pair(13, "a")); 
list.add(new Pair(12, "d")); 
list.add(new Pair(9, "a")); 

的Java 8不支持排序时自定义的内联比较,但在你的情况下,它显示了要两个级别的排序,首先由数字,然后通过短信(或副-versa为另一个比较器)。在这种情况下,我们定义了两个自定义比较器。第二种分拣条件通过Comparator#thenComparing()方法以链式方式添加。然后,我们将一个流转换为一个实际的排序列表。

Comparator<Pair> c1 = Comparator.comparing(pair -> -pair.num); 
c1 = c1.thenComparing(Comparator.comparing(pair -> pair.text)); 
Stream<Pair> pairStream = list.stream().sorted(c1); 

List<Pair> sortedPairs = pairStream.collect(Collectors.toList()); 

System.out.println("Sorting descending by number:"); 
for (Pair p : sortedPairs) { 
    System.out.println("(" + p.getNum() + ", " + p.getText() + ")"); 
} 

Comparator<Pair> c2 = Comparator.comparing(pair -> pair.text); 
c2 = c2.thenComparing(Comparator.comparing(pair -> pair.num)); 
pairStream = list.stream().sorted(c2); 

sortedPairs = pairStream.collect(Collectors.toList()); 

System.out.println("Sorting ascending by text:"); 
for (Pair p : sortedPairs) { 
    System.out.println("(" + p.getNum() + ", " + p.getText() + ")"); 
} 

输出:

Sorting descending by number: 
(13, a) 
(12, d) 
(9, a) 
Sorting ascending by text: 
(9, a) 
(13, a) 
(12, d) 

演示在这里:

Rextester

0

这确实要求数据类本身不是Comparable但使用是相当排序两种不同的Comparator s。

其余的依赖于您的其他要求 - 修改集合比阅读更常见吗?你打算使用List语义(集合中有重复的项目),还是将Set?根据不同的情况,保存这些项目的结构可能是List中的任何一种,其中有两种方法可根据两个比较器中的一个复制和排序列表,以保留两个TreeSets以保存预先排序的值。