gpt4 book ai didi

java - TreeSet 自定义比较器算法 .. 字符串比较

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:41:55 27 4
gpt4 key购买 nike

从提供的输入字符串:

{ "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 个元素顺序进行排序,因此预期的输出将是:

(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)

但由于字符串比较 11 小于 9 但在整数方面, 11>9 。我的预期输出有所不同。给我一些解决问题的想法。

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" 之前),您需要做的是将它们转换为整数,然后进行比较他们:

不是:

return splitA[2].compareTo(splitB[2]);

但是:

return Integer.valueOf(splitA[2]).compareTo(Integer.valueOf(splitB[2]));

但是,更简洁的方法是创建一个包含这 4 个不同值的自定义对象,然后创建一个 Comparator 来比较此类对象的第 3 个rd 值:

以下内容:

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)

关于java - TreeSet 自定义比较器算法 .. 字符串比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8092777/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com