如何对服装尺寸列表进行排序(例如4XL,S,2XL)?

Nid*_*rlu 7 java java-8

我需要你的帮助按照查询.鉴于以下列表:

["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列表太小了.

与所有与性能相关的内容:使用您认为最具可读性的内容; 如果您认为这是性能瓶颈,那么只有尝试替代方案.

  • 此外,如果遇到`desiredOrder`中没有包含的`Strings`,那么`Map`方法将抛出(除非你指定了null-behavior,例如[nullsFirst](https://docs.oracle.com/javase) /8/docs/api/java/util/Comparator.html#nullsFirst-java.util.Comparator-)),而`indexOf` - 方法默默地将它们排序到前面(因为它们的索引是`-1`). (2认同)

Hol*_*ger 7

一般方法将关注大小字符串背后的模式,而不仅仅是容纳样本输入.你必须通过表示的根本方向S,ML之前(除非任选的改性剂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方法.

  • @Eugene这只是一种面向未来的方法.让快餐继续做它的工作...... (3认同)