TreeSet自定义比较器算法..字符串比较 [英] TreeSet Custom Comparator Algo .. String Comparision
问题描述
从提供的输入字符串中:
From the input string provided:
{ 200,400,7,1, 100,0,1,1, 200,200,3,1, 0,400,11,1,
407,308,5,1, 100,600,9,1},
{ "200,400,7,1", "100,0,1,1", "200,200,3,1", "0,400,11,1", "407,308,5,1","100,600,9,1" } ,
我要在TreeSet中添加相同的内容,并希望将其与第3个元素顺序进行排序,因此预期输出为:
I am adding the same in a TreeSet and want it to be sorted with the 3rd element order, so the expected output will be:
(100,0,1,1)(200,200,3,1)(407,308,5,1)(200,400,7,1)(100,600,9,1)(0,400,11 ,1)
(100,0,1,1) (200,200,3,1) (407,308,5,1) (200,400,7,1) (100,600,9,1) (0,400,11,1)
但是我的实际输出是:
(100,0,1,1)(0,400,11,1)(200,200,3,1)(407,308,5,1)(200,400,7,1)(100,600,9,1)
(100,0,1,1)(0,400,11,1)(200,200,3,1)(407,308,5,1)(200,400,7,1)(100,600,9,1)
但是由于11的字符串比较小于9,但以整数11> 9表示。我的预期输出变得不同。
But since the string comparison of 11 is less than 9 but in terms of integer , 11>9 . My expected output is getting differed. Suggest me some idea to resolve the same.
import java.util.Comparator;
import java.util.TreeSet;
public class TreeSetComparator {
public static void main(String[] args) {
Comparator<String> comparator = new Comparator<String>() {
@Override
public int compare(String a, String b) {
String aStr = a;
String bStr = b;
String[] splitA = aStr.split(",");
String[] splitB = bStr.split(",");
return splitA[2].compareTo(splitB[2]);
}
};
String[] arr = { "200,400,7,1", "100,0,1,1", "200,200,3,1",
"0,400,11,1", "407,308,5,1", "100,600,9,1" };
TreeSet<String> ts = new TreeSet<String>(comparator);
for (String str : arr) {
ts.add(str);
}
for (String element : ts)
System.out.print(element + " ");
}
}
推荐答案
您按字典顺序排序( 123
在 20
之前)要做的就是将它们转换为整数,然后进行比较:
You're sorting in a lexicographical order ("123"
comes before "20"
), what you need to do is convert them to integers, and then compare them:
否:
return splitA[2].compareTo(splitB[2]);
但是:
return Integer.valueOf(splitA[2]).compareTo(Integer.valueOf(splitB[2]));
不过,一种更简洁的方法是创建一个包含这四个不同值的自定义对象,然后创建比较器
,用于比较此类对象的3 rd 值:
However, a somewhat cleaner way would be to create a custom object holding these 4 different values and then create a Comparator
that compares the 3rd value of such an object:
:
public class Main {
public static void main (String[] args) {
Comparator<CustomObject> sortOn3rdValue = new Comparator<CustomObject>() {
@Override
public int compare(CustomObject o1, CustomObject o2) {
return o1.v3 < o2.v3 ? -1 : o1.v3 > o2.v3 ? 1 : 0;
}
};
Set<CustomObject> objects = new TreeSet<CustomObject>(sortOn3rdValue);
String[] arr = { "200,400,7,1", "100,0,1,1", "200,200,3,1", "0,400,11,1", "407,308,5,1", "100,600,9,1" };
for(String a : arr) {
objects.add(new CustomObject(a.split(",")));
}
for(CustomObject co : objects) {
System.out.println(co);
}
}
}
class CustomObject {
final int v1, v2, v3, v4;
CustomObject(String[] strValues) {
// assume strValues.lenght == 4
v1 = Integer.valueOf(strValues[0]);
v2 = Integer.valueOf(strValues[1]);
v3 = Integer.valueOf(strValues[2]);
v4 = Integer.valueOf(strValues[3]);
}
@Override
public String toString() {
return String.format("(%d,%d,%d,%d)", v1, v2, v3, v4);
}
}
将打印:
(100,0,1,1)
(200,200,3,1)
(407,308,5,1)
(200,400,7,1)
(100,600,9,1)
(0,400,11,1)
这篇关于TreeSet自定义比较器算法..字符串比较的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!