在不铸造的情况下比较部分数字的字符串



我已经搜索了一些谷歌搜索,但找不到解决此类特定问题的解决方案。我有一个pojos的List,确实有一个称为displayCode(字符串类型)的字段。displayCode可以具有不同的格式。一些例子:

622
622-S
622-1
623 
624
625
625-S
625-1
625-1-S
625-2
625-2-S

排序后,它们也应如上所示。使用普通s1.compareTo(s2);,我得到这样的订单:

1
10
100
101
102
...

显然不适合我需要的东西。可悲的是,我没有计划如何以任何平稳的方式实现这一目标(也没有其他方式)。另请注意,我不能使用Java 8中的任何东西。

用于测试目的的代码(您可以随身携带):

List<String> s = new ArrayList<String>(Arrays.asList(new String[] { "622", "622-S", "622-1", "623", "625",
        "625-S", "625-1", "625-1-S", "625-2", "625-2-S", "6", "60", "666", "1", "2", "3" }));
Collections.sort(s,new Comparator<String>() {
    @Override
    public int compare(String o1, String o2) {
        return 0;
    }
});
System.out.println(s);

编辑:我的第一个想法会施放数字,直到第一个-进行INT并进行比较,并将我的方式也延伸到其他部件。但这听起来不流畅。

除了隔离每个字符串的数字部分,转换为一个数字,比较它们,只有在它们相等时进行词典比较,才能对其进行比较。p>,例如,沿着这些行(概念,可能需要调整):

@Override
public int compare(String o1, String o2) {
    String[] p1 = o1.split(" ", 2);
    String[] p2 = o2.split(" ", 2);
    try {
        int n1 = Integer.parseInt(p1[0]);
        int n2 = Integer.parseInt(p2[0]);
        if (n1 != n2) {
            return n1 - n2;
        }
        boolean s1 = p1.length > 1 && p1.equals("S");
        boolean s2 = p2.length > 1 && p2.equals("S");
        if (s1 && !s2) {
            return -1;
        }
        if (!s1 && s2) {
            return 1;
        }
    } catch (NumberFormatException e) {
    }
    return o1.compareTo(o2);
}

这可能会对您有所帮助。

Collections.sort(s, new Comparator<String>() {
            public int compare(String o1, String o2) {
                int returnValue = -1;
                Integer left = returnIfNumeric(o1);
                Integer right = returnIfNumeric(o2);
                // if both values are number
                if (left != null && right != null) {
                    if (left > right)
                        returnValue = 1;
                    else if (left == right)
                        returnValue = 0;
                    else
                        returnValue = -1;
                } 
                // if both values are string
                else if (left == null && left == right) {
                    return o1.compareTo(o2);
                }
                // if left is number
                else if (left != null) {
                    returnValue = -1;
                }
                // if left is string
                else {
                    returnValue = 1;
                }
                return returnValue;
            }
        });
    }
    public static Integer returnIfNumeric(String str) {
        Integer number = null;
        try {
            number  = Integer.valueOf(str);
        } catch (NumberFormatException nfe) {
            number = null;
        }
        return number;
    }

Java字符串具有split方法,您可以用它来隔离Pojos的数字部分;然后,您可以使用parseInt将POJO作为整数,这将使您以您想要的方式进行排序。

相关内容

  • 没有找到相关文章

最新更新