在 java 中对数字字符串间隔进行排序
Sorting numeric String interval in java
我有一个人 class 和一些人,还有姓名、年龄段等详细信息。
年龄区间为{"0-5", "6-10", "11-30","31-45", "46-50","50-100", "100-110"};
我有一个 Person class 和 name
,ageBand
字符串间隔和它的参数化构造函数,getters,setters。
class Person {
String name;
String ageBand; //say it is string "0-50" which i pass in constructor while creating a person.
//getters
//setters
}
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.
}
}
下面是我用我的代码对时间间隔进行排序的方法。
我需要根据增加的间隔对人员进行排序。
我正在使用 Treemap 对间隔进行排序。
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]
尝试拆分您的 ageBand
字符串并将其转换为 Integer
,排序会更容易。
person.stream().sorted(Comparator.comparing(element -> Integer.parseInt(element.getAgeBand().split("-")[0])))
.collect(Collectors.toList());
如果不想用Java 8
,可以用Collections.sort()
的方法。
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]);
}
});
我们 可以 尝试在这里变得非常聪明,并将自定义比较器传递给 TreeMap
,它实际上比较范围。但是请注意,由于您的范围完全不重叠,我们可以只使用 Person
各自范围的较低(甚至较高)值来表示,并获得相同的排序效果。因此,我提出以下建议:
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());
}
});
如果您按照希望打印出来的方式放置键值,则可以使用 LinkedHashMap
- 它会记住放置顺序。
您需要将间隔抽象为一个接口:
interface Interval extends Comparable {
int left();
int right();
}
public final class IntervalImpl implements Interval {
private final int left;
private final int right;
public IntervalImpl(int left, int right) {
this.left = left;
this.right = right;
}
public IntervalImpl(String interval) {
this.left = Integer.parseInt(interval.split("-")[0]);
this.right = Integer.parseInt(interval.split("-")[1]);
}
@Override
public int left() { return left; }
@Override
int right() { return right; }
@Override
int compareTo(Interval other) {
return left.compareTo(other.left());
}
}
然后用在你的身上class:
public final class Person {
private final Interval interval;
private final String name;
public Person (String name, String interval) {
this.name = name;
this.interval = new Interval(interval);
}
public Interval getInterval() {
return interval;
}
}
然后在地图中使用它:
Map<Interval, Person> map = new TreeMap<>();
我什至建议将您的间隔常量移动到 Enum
。把它放在你的 Interval
抽象中。
这是您想要的代码片段:
Map<String,Person> ageBandMap = new LinkedHashMap<>();
Map<Integer, Person> ageBandIntMap = new TreeMap<>();
for(Person p: person)
ageBandIntMap.put(Integer.parseInt(p.ageBand.split("-")[0]), p);
for(Entry<Integer, Person> entry : ageBandIntMap.entrySet())
ageBandMap.put(entry.getValue().ageBand, entry.getValue());
for(Entry<String, Person> entry : ageBandMap.entrySet())
System.out.format("\nageBand : %7s\t Person name : %S", entry.getKey(), entry.getValue().name);
我有一个人 class 和一些人,还有姓名、年龄段等详细信息。
年龄区间为{"0-5", "6-10", "11-30","31-45", "46-50","50-100", "100-110"};
我有一个 Person class 和 name
,ageBand
字符串间隔和它的参数化构造函数,getters,setters。
class Person {
String name;
String ageBand; //say it is string "0-50" which i pass in constructor while creating a person.
//getters
//setters
}
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.
}
}
下面是我用我的代码对时间间隔进行排序的方法。 我需要根据增加的间隔对人员进行排序。 我正在使用 Treemap 对间隔进行排序。
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]
尝试拆分您的 ageBand
字符串并将其转换为 Integer
,排序会更容易。
person.stream().sorted(Comparator.comparing(element -> Integer.parseInt(element.getAgeBand().split("-")[0])))
.collect(Collectors.toList());
如果不想用Java 8
,可以用Collections.sort()
的方法。
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]);
}
});
我们 可以 尝试在这里变得非常聪明,并将自定义比较器传递给 TreeMap
,它实际上比较范围。但是请注意,由于您的范围完全不重叠,我们可以只使用 Person
各自范围的较低(甚至较高)值来表示,并获得相同的排序效果。因此,我提出以下建议:
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());
}
});
如果您按照希望打印出来的方式放置键值,则可以使用 LinkedHashMap
- 它会记住放置顺序。
您需要将间隔抽象为一个接口:
interface Interval extends Comparable {
int left();
int right();
}
public final class IntervalImpl implements Interval {
private final int left;
private final int right;
public IntervalImpl(int left, int right) {
this.left = left;
this.right = right;
}
public IntervalImpl(String interval) {
this.left = Integer.parseInt(interval.split("-")[0]);
this.right = Integer.parseInt(interval.split("-")[1]);
}
@Override
public int left() { return left; }
@Override
int right() { return right; }
@Override
int compareTo(Interval other) {
return left.compareTo(other.left());
}
}
然后用在你的身上class:
public final class Person {
private final Interval interval;
private final String name;
public Person (String name, String interval) {
this.name = name;
this.interval = new Interval(interval);
}
public Interval getInterval() {
return interval;
}
}
然后在地图中使用它:
Map<Interval, Person> map = new TreeMap<>();
我什至建议将您的间隔常量移动到 Enum
。把它放在你的 Interval
抽象中。
这是您想要的代码片段:
Map<String,Person> ageBandMap = new LinkedHashMap<>();
Map<Integer, Person> ageBandIntMap = new TreeMap<>();
for(Person p: person)
ageBandIntMap.put(Integer.parseInt(p.ageBand.split("-")[0]), p);
for(Entry<Integer, Person> entry : ageBandIntMap.entrySet())
ageBandMap.put(entry.getValue().ageBand, entry.getValue());
for(Entry<String, Person> entry : ageBandMap.entrySet())
System.out.format("\nageBand : %7s\t Person name : %S", entry.getKey(), entry.getValue().name);