关于java使用Comparator多列数据升序、降序排列的问题。哪位大侠能解决
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于java使用Comparator多列数据升序、降序排列的问题。哪位大侠能解决相关的知识,希望对你有一定的参考价值。
编号,会员号,客户号,产品号,录入顺序号
1 ,001, 00003, mn01, 10001
2 ,001, 00004, mn01, 10002
3 ,002, 00002, mn02, 10003
……
要求排序如下:
先根据产品号升序,再根据会员号升序,再根据客户号升序,再根据录入顺序号降序排列。
想了好久没想出来,等待哪位大侠来帮忙解决。
目前用的是collection.sort(list,new Comparator);不会做,
重写一下compare方法就行啊。
一个多if判断的问题,
升序代码
如果(产品好相等)
升序代码
如果(会员号相等)
升序代码
如果(客户号相等)
降序代码
如果(顺序号相等)
升序和降序其实就是a>b是return 1还是return -1 的事。
如果需要代码就接着追问。 参考技术A Comparator<产品> comparator = new Comparator<产品>()
@Override
public int compare(产品 o1, 产品 o2)
int result = o1.get产品号().compareTo(o2.get产品号());
if (result == 0) result = o1.get会员号().compareTo(o2.get会员号());
if (result == 0) result = o1.get客户号().compareTo(o2.get客户号());
if (result == 0) result = o2.get录入顺序号().compareTo(o1.get录入顺序号());
return result;
; 参考技术B 一个比较器实现不了吧!不要使用一个比较器,尽量! 参考技术C 使用Comparator ,要自己实现一个比较器
Java SortedMap Comparator 在字母键之后排序数字键
【中文标题】Java SortedMap Comparator 在字母键之后排序数字键【英文标题】:Java SortMap Comparator to have digit keys ordered after letter keys 【发布时间】:2020-07-16 06:45:17 【问题描述】:我需要一个 SortedMap,其中的字符键按以下方式排序:('A'..'Z'..'0'..'9'),所以首先是字符,然后是数字,所有这些都按升序排列。 这是我到目前为止所尝试的,但是,输出显示它无法返回我想要的排序,因为数字键的值仍然在字母键的值之前。 我究竟做错了什么?有没有更好的方法来做到这一点? 提前致谢!
public static void main(String[] args)
SortedMap<Character, String> sortedMap = new TreeMap<>(new Comparator<Character>()
@Override
public int compare(Character o1, Character o2)
if (Character.isDigit(o1) && Character.isLetter(o2))
return o2.compareTo(o1);
else if(Character.isLetter(o1) && Character.isDigit(o2))
return o1.compareTo(o2);
else
return o1.compareTo(o2);
);
sortedMap.put('5', "five");
sortedMap.put('8', "nine");
sortedMap.put('A', "ALPHA");
sortedMap.put('G', "GOLF");
sortedMap.put('F', "FOXTROT");
System.out.println(sortedMap.values());
【问题讨论】:
【参考方案1】:如果 o1 是数字而 o2 是字母,则需要返回结果“o1 > o2”,所以在这种情况下返回 1。同样,如果o1是字母,o2是数字,则需要返回结果“o1
public int compare(Character o1, Character o2)
if (Character.isDigit(o1) && Character.isLetter(o2))
return 1;
else if(Character.isLetter(o1) && Character.isDigit(o2))
return -1;
else
return o1.compareTo(o2);
【讨论】:
【参考方案2】:如果o1
是一个字母而o2
是一个数字,则您应该始终返回-1,因为您始终希望字母在前。如果相反,您应该始终返回 1。
它应该返回o1.compareTo(o2)
的唯一情况是在最后的else
中,这意味着o1
和o2
都是字母或数字,在这种情况下,比较器应该简单地遵循自然顺序。
【讨论】:
【参考方案3】:假设您使用的是 Java 8+,请将您的 Map 声明为:
SortedMap<Character, String> sortedMap =
new TreeMap<>(Comparator.comparingInt(c -> (c + 197) % 255));
或者,您可以将“幻数”197 和 255 提取到常量中,或者将comparingInt(..)
的参数提取到常量中。
说明: 字符 0..9 对应 ASCII 码 48..57 所有字母的 ASCII 码都属于范围 65..122 上面的代码稍微移动了代码,将数字范围移动到 245..254,将字母范围移动到 7..64 由于 Comparator 比较移位的代码,它会将字母放在数字之前
【讨论】:
不错的解决方案。 +1。【参考方案4】:当您希望所有字母都在所有数字之前,并且您得到一个数字和一个字母时,您根本不应该比较它们:
public int compare(Character o1, Character o2)
if (Character.isDigit(o1) && Character.isLetter(o2))
// o1 < o2 regardless of what values o1 and o2 are
// So return any negative integer
return -100;
else if (Character.isLetter(o1) && Character.isDigit(o2))
// o1 > o2 regardless of what values o1 and o2 are
// So return any positive integer
return 100;
// Both must be letters or both must be integers
// fall back to normal comparison, as you have already done
return o1.compareTo(o2);
【讨论】:
是的,它有效,但这是一个坏习惯。始终返回 1、-1 或 0。【参考方案5】:我更喜欢在 Map 声明之外使用 ternary (?:)
构造来构建 Comparator
。我还添加了一些额外的值,这些值穿插在你的值中以增加可变性。
Comparator<Character> comp = (a, b) -> Character.isLetter(a)
&& Character.isDigit(b) ? -1 :
Character.isLetter(b) && Character.isDigit(a) ? 1 :
a.compareTo(b);
SortedMap<Character, String> sortedMap = new TreeMap<>(comp);
sortedMap.put('Q', "Quebec");
sortedMap.put('B', "Beta");
sortedMap.put('5', "five");
sortedMap.put('9', "nine");
sortedMap.put('A', "ALPHA");
sortedMap.put('3', "three");
sortedMap.put('G', "GOLF");
sortedMap.put('F', "FOXTROT");
sortedMap.entrySet().forEach(System.out::println);
打印
A=ALPHA
B=BETA
F=FOXTROT
G=GOLF
Q=QUEBEC
3=three
5=five
9=nine
【讨论】:
以上是关于关于java使用Comparator多列数据升序、降序排列的问题。哪位大侠能解决的主要内容,如果未能解决你的问题,请参考以下文章
java Collections.sort实现的排序是升序还是降序
请教:JAVA中,comparator接口如何对double型数据进行排序。