我需要你的帮助按照查询.鉴于以下列表:
["2XL", "3XL", "4XL", "5XL", "6XL", "L", "M", "S", "XL"]
Run Code Online (Sandbox Code Playgroud)
如何对其进行排序以使其按此顺序排列?
["S","M","L","XL","2XL","3XL","4XL","5XL","6XL"]
请注意,并不总是存在每个尺寸.
And*_*ner 17
构建一个比较器,对您所需的订单进行查找:
Comparator<String> sizeOrder = Comparator.comparingInt(desiredOrder::indexOf);
Run Code Online (Sandbox Code Playgroud)
哪里
desiredOrder = Arrays.asList("S", "M", "L", "XL", "2XL", "3XL", "4XL", "5XL", "6XL");
Run Code Online (Sandbox Code Playgroud)
然后:
yourList.sort(sizeOrder);
Run Code Online (Sandbox Code Playgroud)
如果需要,可以Map<String, Integer>
为查找构建一个:
Map<String, Integer> lookup =
IntStream.range(0, desiredOrder.length())
.boxed()
.collect(Collectors.toMap(desiredOrder::get, i -> i));
Run Code Online (Sandbox Code Playgroud)
然后做:
Comparator<String> sizeOrder = Comparator.comparing(lookup::get);
Run Code Online (Sandbox Code Playgroud)
我不相信这会比使用更高效List.indexOf
,因为desiredOrder
列表太小了.
与所有与性能相关的内容:使用您认为最具可读性的内容; 如果您认为这是性能瓶颈,那么只有尝试替代方案.
一般方法将关注大小字符串背后的模式,而不仅仅是容纳样本输入.你必须通过表示的根本方向S
,M
或L
之前(除非任选的改性剂M
):改变幅度.
static Pattern SIZE_PATTERN=Pattern.compile("((\\d+)?X)?[LS]|M", Pattern.CASE_INSENSITIVE);
static int numerical(String size) {
Matcher m = SIZE_PATTERN.matcher(size);
if(!m.matches()) throw new IllegalArgumentException(size);
char c = size.charAt(m.end()-1);
int n = c == 'S'? -1: c == 'L'? 1: 0;
if(m.start(1)>=0) n *= 2;
if(m.start(2)>=0) n *= Integer.parseInt(m.group(2));
return n;
}
Run Code Online (Sandbox Code Playgroud)
然后,您可以对大小列表进行排序
List<String> sizes = Arrays.asList("2XL", "5XL", "M", "S", "6XL", "XS", "3XS", "L", "XL");
sizes.sort(Comparator.comparing(Q48298432::numerical));
System.out.print(sizes.toString());
Run Code Online (Sandbox Code Playgroud)
其中Q48298432
应用含有的类的名称替换numerical
方法.
归档时间: |
|
查看次数: |
813 次 |
最近记录: |