简体   繁体   English

TreeSet Custom Comparator Algo .. String Comparision

[英]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” },

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: 我在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)(200,200,3,1)(407,308,5,1)(200,400,7,1)(100,600,9,1)(0,400,11,1)

But my actual output is: 但我的实际输出是:

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

But since the string comparison of 11 is less than 9 but in terms of integer , 11>9 . 但由于11的字符串比较小于9,但就整数而言,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 + " ");

    }
}

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: 你按照字典顺序排序( "123"出现在"20"之前),你需要做的是将它们转换为整数,然后比较它们:

Not: 不:

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

but: 但:

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

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 3 rd value of such an object: 然而,稍微更清洁的方式是创建自定义对象保持这4个不同的值,然后创建一个Comparator ,其比较这样的对象的第3值:

The following: 下列:

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

would print: 会打印:

(100,0,1,1)
(200,200,3,1)
(407,308,5,1)
(200,400,7,1)
(100,600,9,1)
(0,400,11,1)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM