我需要你的帮助跟踪查询。鉴于以下清单:
["2XL", "3XL", "4XL", "5XL", "6XL", "L", "M", "S", "XL"]
我怎样才能把它按这个顺序分类呢?
"S“、"M”、"L“、"XL”、“2 XL”、“3 XL”、“4 XL”、“5 XL”、“6 XL”
请注意,每个大小并不总是存在的。
发布于 2018-01-17 11:09:45
一种通用方法将重点放在大小字符串背后的模式上,而不仅仅是修改示例输入。您有一个由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;
}
然后,您可以对一个大小列表进行排序,例如
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());
应该将Q48298432
替换为包含numerical
方法的类的名称。
发布于 2018-01-17 10:12:00
构建一个比较器,该比较器对所需的订单进行查找:
Comparator<String> sizeOrder = Comparator.comparingInt(desiredOrder::indexOf);
哪里
desiredOrder = Arrays.asList("S", "M", "L", "XL", "2XL", "3XL", "4XL", "5XL", "6XL");
然后:
yourList.sort(sizeOrder);
如果需要,可以为查找构建一个Map<String, Integer>
:
Map<String, Integer> lookup =
IntStream.range(0, desiredOrder.length())
.boxed()
.collect(Collectors.toMap(desiredOrder::get, i -> i));
然后做:
Comparator<String> sizeOrder = Comparator.comparing(lookup::get);
我不认为这比使用List.indexOf
更具有性能,因为desiredOrder
列表太小了。
与所有性能相关的内容一样:使用您认为最易读的;配置文件,如果您认为这是性能瓶颈,然后尝试其他方法。
发布于 2018-01-17 10:26:55
使用可能更高效、更清晰的enum
路由的替代方案。
// Sizes in sort order.
enum Size {
SMALL("S"),
MEDIUM("M"),
LARGE("L"),
EXTRA_LARGE("XL"),
EXTRA2_LARGE("2XL"),
EXTRA3_LARGE("3XL"),
EXTRA4_LARGE("4XL"),
EXTRA5_LARGE("5XL"),
EXTRA6_LARGE("6XL");
private final String indicator;
Size(String indicator) {
this.indicator = indicator;
}
static final Map<String,Size> lookup = Arrays.asList(values()).stream()
.collect(Collectors.toMap(
// Key is the indicator.
s -> s.indicator,
// Value is the size.
s-> s));
public static Size lookup(String s) {
return lookup.get(s.toUpperCase());
}
// Could be improved to handle failed lookups.
public static final Comparator<String> sizeOrder = (o1, o2) -> lookup(o1).ordinal() - lookup(o2).ordinal();
}
public void test(String[] args) {
List<String> test = Arrays.asList("S","6XL", "L");
Collections.sort(test, Size.sizeOrder);
System.out.println(test);
}
https://stackoverflow.com/questions/48298432
复制相似问题