首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在java中排序数字字符串间隔

在java中排序数字字符串间隔
EN

Stack Overflow用户
提问于 2017-09-04 11:35:23
回答 5查看 1.2K关注 0票数 5

我和一些人一起上了个人课,还有名字,年龄范围的细节。

年龄区间为{"0-5“、"6-10”、"11-30“、"31-45”、"46-50“、"50-100”、"100-110"};

我有一个带有nameageBand字符串间隔的Person类,它是参数化构造函数、getter、setter。

代码语言:javascript
运行
复制
class Person {
    String name;
    String ageBand; //say it is string "0-50" which i pass in constructor while creating a person.
    //getters
    //setters
}

代码语言:javascript
运行
复制
class TestAgeBand {
    public static void main(String args[]) {
        ArrayList<Person> person = new ArrayList<Person>();

        Person p1 = new Person("Mike1", "0-5");   
        Person p2 = new Person("Mike2", "6-10");
        Person p3 = new Person("Mike3", "11-30");   
        Person p4 = new Person("Mike4", "31-45");   
        Person p5 = new Person("Mike5", "50-100");   
        Person p6 = new Person("Mike6", "46-50"); 
        Person p7 = new Person("Mike7", "100-110");

        person.add(p1);
        //adding all persons to list.
    }
}

下面是我用代码对间隔进行排序的方法。我需要根据增加的间隔对人进行排序。我用树状地图来分类间隔时间。

代码语言:javascript
运行
复制
Map<String, Person> ageBandMap = new TreeMap<String, Person>(){
    for(Person p: person) {
        ageBandMap.put(p.ageBand, p.name);
    }
}

当我打印间隔键集时,我得到

输出:

0-5,100-110,11-30,31-45,46-50,50-100,6-10

我不需要。我需要这样的间隔:

0-5,6-10,11-30,31-45,46-50,50-100,100-110

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2017-09-04 11:41:47

尝试拆分ageBand字符串并将其转换为Integer,这样会更容易排序。

代码语言:javascript
运行
复制
person.stream().sorted(Comparator.comparing(element -> Integer.parseInt(element.getAgeBand().split("-")[0])))
            .collect(Collectors.toList());

如果不想使用Java 8,可以使用Collections.sort()方法。

代码语言:javascript
运行
复制
 Collections.sort(person, new Comparator<Person>() {
        @Override
        public int compare(Person o1, Person o2) {
            return Integer.parseInt(o1.getAgeBand().split("-")[0]) - Integer.parseInt(o2.getAgeBand().split("-")[0]);
        }
    });
票数 4
EN

Stack Overflow用户

发布于 2017-09-04 11:43:46

我们可以尝试在这里变得非常聪明,并将一个自定义比较器传递给TreeMap,该比较器实际上比较范围。但是请注意,由于您的范围完全不重叠,我们可以使用其各自范围的较低(甚至更高)值来表示Person,并获得相同的排序效果。因此,我建议如下:

代码语言:javascript
运行
复制
public class Person {
    String name;
    Integer lower;
    Integer upper;
}

SortedSet<Person> set =
    new TreeSet<Person>(new Comparator<Person>()
    {
        public int compare(Person p1, Person p2) {
            if (p1 == null && p2 == null) return 0;
            if (p1 == null) return -1;
            if (p2 == null) return 1;
            return p1.getLower().compareTo(p2.getLower());
        }
    });
票数 2
EN

Stack Overflow用户

发布于 2017-09-04 11:51:05

如果你把键值按你想要的方式打印出来,你可以使用LinkedHashMap -它记住放置顺序。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46036155

复制
相关文章

相似问题

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