如果一个变量的名称和数字都存在,如何在java中进行排序

如果一个变量的名称和数字都存在,如何在java中进行排序,java,sorting,spring-boot,Java,Sorting,Spring Boot,我在做排序工作,所以我使用JavaSpringBoot,我使用的是当前按排序的流 排序代码为:- projectResponse.setDetails(v.stream() .sorted(Comparator.comparing(StateResponse::getState) .thenComparing(Comparator.comparing(NameResponse::getName)))

我在做排序工作,所以我使用JavaSpringBoot,我使用的是当前按排序的流

排序代码为:-

projectResponse.setDetails(v.stream()
                    .sorted(Comparator.comparing(StateResponse::getState)
                            .thenComparing(Comparator.comparing(NameResponse::getName)))
                    .collect(Collectors.toList()));
先按州排序,然后按名称排序

我的名字有一些值,比如:“name-98”、“name-99”、“name-100”
因此,当它排序时,它将正确排序到99,但当100出现时,它是第一个排序的数字,然后从100101102开始排序是正确的,这种情况将再次出现,当否穿过999,然后排序将从10001001正确出现。克服这一问题的最佳解决方案是什么?

使用自定义比较器将数字按数字顺序排序,同时将文本按字母顺序排序,这会很有帮助。这通常被称为“自然排序”。这里有一个实现可以做到这一点:

要在流操作中使用它,请执行以下操作:

thenComparing(NameResponse::getName, new AlphanumComparator())
比较“名称”部分,然后比较数字部分。例如:-

List<String> list = List.of("name-99", "name-98", "name-100");
List<String> sortedList = list.stream()
        .sorted(Comparator.comparing(s -> ((String) s).substring(0, ((String) s).indexOf("-")))
                .thenComparing(o -> Integer.parseInt(((String) o).substring(((String) o).indexOf("-") + 1))))
        .collect(Collectors.toList());
System.out.println(sortedList);

您需要将每个名称分成两个部分,例如
name
98
(前者是字符串,后者是数字),然后按顺序按每个部分进行比较。
[name-98, name-99, name-100]