首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >我如何对服装尺寸的列表(例如4 2XL,S,2 2XL)进行排序?

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

Stack Overflow用户
提问于 2018-01-17 10:08:17
回答 7查看 4.5K关注 0票数 10

我需要你的帮助跟踪查询。鉴于以下清单:

代码语言:javascript
运行
复制
["2XL", "3XL", "4XL", "5XL", "6XL", "L", "M", "S", "XL"]

我怎样才能把它按这个顺序分类呢?

"S“、"M”、"L“、"XL”、“2 XL”、“3 XL”、“4 XL”、“5 XL”、“6 XL”

请注意,每个大小并不总是存在的。

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2018-01-17 11:09:45

一种通用方法将重点放在大小字符串背后的模式上,而不仅仅是修改示例输入。您有一个由SML表示的基本方向,以及它之前的可选修饰符(除非是M)。

代码语言:javascript
运行
复制
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;
}

然后,您可以对一个大小列表进行排序,例如

代码语言:javascript
运行
复制
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方法的类的名称。

票数 8
EN

Stack Overflow用户

发布于 2018-01-17 10:12:00

构建一个比较器,该比较器对所需的订单进行查找:

代码语言:javascript
运行
复制
Comparator<String> sizeOrder = Comparator.comparingInt(desiredOrder::indexOf);

哪里

代码语言:javascript
运行
复制
desiredOrder = Arrays.asList("S", "M", "L", "XL", "2XL", "3XL", "4XL", "5XL", "6XL");

然后:

代码语言:javascript
运行
复制
yourList.sort(sizeOrder);

如果需要,可以为查找构建一个Map<String, Integer>

代码语言:javascript
运行
复制
Map<String, Integer> lookup =
    IntStream.range(0, desiredOrder.length())
        .boxed()
        .collect(Collectors.toMap(desiredOrder::get, i -> i));

然后做:

代码语言:javascript
运行
复制
Comparator<String> sizeOrder = Comparator.comparing(lookup::get);

我不认为这比使用List.indexOf更具有性能,因为desiredOrder列表太小了。

与所有性能相关的内容一样:使用您认为最易读的;配置文件,如果您认为这是性能瓶颈,然后尝试其他方法。

票数 17
EN

Stack Overflow用户

发布于 2018-01-17 10:26:55

使用可能更高效、更清晰的enum路由的替代方案。

代码语言:javascript
运行
复制
// 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);
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48298432

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档