Bra*_*rad 3 java sorting collections
我有一个包含这样的数据的字符串向量:
5:34,5:38,17:21,22:11,......
如果我尝试使用Collections.sort(...)合并它; 它会像这样:
17:21,22:11,5:34,5:38
其实我希望它看起来像这样:
5:34,5:38,17:21,22:11
所以我想根据冒号":"之前的数字对元素进行排序,然后如果某些元素在":"之前具有相同的数字,则根据":"之后的数字对它们进行排序.
最简单的方法是什么?
执行此操作的正确方法是不将非字符串值存储为字符串.
集合中的数据具有一些结构和规则,不能是任意字符串.因此,您不应使用String数据类型.
让我们定义一个叫做的类型TwoNumbers(因为我不知道该类型应该代表什么,即使我可以猜到):
class TwoNumbers implements Comparable<TwoNumbers> {
private final int num1;
private final int num2;
public TwoNumbers(int num1, int num2) {
if (num1 <= 0 || num2 <= 0) {
throw new IllegalArgumentException("Numbers must be positive!");
}
this.num1 = num1;
this.num2 = num2;
}
public static TwoNumbers parse(String s) {
String[] parts = s.split(":");
if (parts.length != 2) {
throw new IllegalArgumentException("String format must be '<num>:<num>'");
}
try {
return new TwoNumbers(Integer.parseInt(parts[0]), Integer.parseInt(parts[0]));
} catch (NumberFormatException e) {
throw new IllegalArgumentException("parts must be numeric!", e);
}
}
public int getNum1() {
return num1;
}
public int getNum2() {
return num2;
}
@Override
public int compareTo(TwoNumbers o) {
if (o == null) {
return 1;
}
int diff = Integer.compare(o.num1, this.num1);
if (diff == 0) {
diff = Integer.compare(o.num2, this.num2);
}
return diff;
}
}
Run Code Online (Sandbox Code Playgroud)
该compareTo方法存在的执行的Comparable接口:它定义了此类型的对象是有序的.
我使用了final字段(并没有提供setter),因为该类实现了不可变对象.
这样,您可以直接对数据进行排序Comparator,而无需在程序中分发所有"拆分和解析"代码.相反,你有一个单一类是负责处理特定格式和编码的所有其他部分就只能使用.