如何使用比较器接口按字符串键对地图进行排序
How do you sort a Map by its String Keys using comparator interface
我知道以前有人问过类似的问题,但我有一个具体的问题,我不能搞错。
我想按星期几对地图进行排序,其中星期几是地图的键。你如何比较在比较方法中没有自然顺序的字符串?地图末尾的排序应该是:Mon, Tue, Wed, Thur.
到目前为止,这是我的代码,但我被困在比较方法中。
class OpeningTimes {
private String openingTime;
private String closingTime;
public String getOpeningTime() {
return openingTime;
}
public void setOpeningTime(String openingTime) {
this.openingTime = openingTime;
}
public String getClosingTime() {
return closingTime;
}
public void setClosingTime(String closingTime) {
this.closingTime = closingTime;
}
@Override
public String toString() {
return new StringBuilder( "Opening Times: " + this.openingTime + " Closing Times: " + this.closingTime).toString();
}
}
比较器:
class OpeningTimesComparator implements Comparator<Map.Entry<String, OpeningTimes>>{
@Override
public int compare(Entry<String, OpeningTimes> o1, Entry<String, OpeningTimes> o2) {
return 0; // what is the logic?
}}
亚军:
public class TestClass {
public static void main(String[] args) {
Map<String, OpeningTimes> openingTimesMap = new TreeMap<String, OpeningTimes>();
OpeningTimes openTime1 = new OpeningTimes();
openTime1.setOpeningTime("9PM");
openTime1.setClosingTime("10PM");
OpeningTimes openTime2 = new OpeningTimes();
openTime2.setOpeningTime("11PM");
openTime2.setClosingTime("9PM");
OpeningTimes openTime3 = new OpeningTimes();
openTime3.setOpeningTime("13PM");
openTime3.setClosingTime("14PM");
OpeningTimes openTime4 = new OpeningTimes();
openTime4.setOpeningTime("15PM");
openTime4.setClosingTime("13PM");
openingTimesMap.put("Tue", openTime2);
openingTimesMap.put("Thu", openTime4);
openingTimesMap.put("Mon", openTime1);
openingTimesMap.put("Wed", openTime3);
for (Entry<String, OpeningTimes> openingTimesSingle : openingTimesMap.entrySet()) {
System.out.println("Key: " + openingTimesSingle.getKey() + " Value: " + openingTimesMap.get(openingTimesSingle.getKey()));
}
List<Map.Entry<String, OpeningTimes>> list = new ArrayList<Map.Entry<String, OpeningTimes>>(openingTimesMap.entrySet());
Collections.sort(list, new OpeningTimesComparator());
for (Entry<String, OpeningTimes> openingTimesSingle : openingTimesMap.entrySet()) {
System.out.println("Key: " + openingTimesSingle.getKey() + " Value: " + openingTimesMap.get(openingTimesSingle.getKey()));
}
}
}
提前致谢
Enum 将是一个很好的解决方案,否则您必须使用其他一些包含您的自定义订单值的静态地图。
像这样定义一个枚举
enum Week{
SUN,MON,TUE,WED,THU,FRI,SAT
}
创建 EnumMap
的实例并添加条目,当您遍历 keySet
时,将按照枚举
中提到的顺序检索条目
Map<Week, String> map = new EnumMap<Week, String>(Week.class);
map.put(Week.WED, "Wednesday");
map.put(Week.SUN, "Sunday");
map.put(Week.MON, "Monday");
map.put(Week.THU, "Thursday");
map.put(Week.SAT, "Saturday");
map.put(Week.FRI, "Friday");
map.put(Week.TUE, "Tuesday");
for(Week week : map.keySet()){
System.out.println(week + " -- " +map.get(week));
}
输出:
SUN -- Sunday
MON -- Monday
TUE -- Tuesday
WED -- Wednesday
THU -- Thursday
FRI -- Friday
SAT -- Saturday
与我在枚举中定义的顺序相同。当然, EnumMap
仅当您的地图中的键范围有限时才有用且高效,例如在您的情况下一周中的几天。希望这会有所帮助:)
选项 2 :-
这一工作假设 inputKeys
完全由您管理。请注意这一点,因为如果给定键不存在映射,它可能会给您带来 NPE。
private static Map<String,Integer> orderMappings = new HashMap<>();
static{
orderMappings.put("Sunday", 1);
orderMappings.put("Monday", 2);
orderMappings.put("Tuesday", 3);
orderMappings.put("Wednesday", 4);
orderMappings.put("Thursday", 5);
orderMappings.put("Friday", 6);
orderMappings.put("Saturday", 7);
}
class OrderComparator implements Comparator<String>{
@Override
public int compare(String key1, String key2) {
int p1 = orderMappings.get(key1);
int p2 = orderMappings.get(key2);
return p1-p2;
}
}
我知道以前有人问过类似的问题,但我有一个具体的问题,我不能搞错。
我想按星期几对地图进行排序,其中星期几是地图的键。你如何比较在比较方法中没有自然顺序的字符串?地图末尾的排序应该是:Mon, Tue, Wed, Thur.
到目前为止,这是我的代码,但我被困在比较方法中。
class OpeningTimes {
private String openingTime;
private String closingTime;
public String getOpeningTime() {
return openingTime;
}
public void setOpeningTime(String openingTime) {
this.openingTime = openingTime;
}
public String getClosingTime() {
return closingTime;
}
public void setClosingTime(String closingTime) {
this.closingTime = closingTime;
}
@Override
public String toString() {
return new StringBuilder( "Opening Times: " + this.openingTime + " Closing Times: " + this.closingTime).toString();
}
}
比较器:
class OpeningTimesComparator implements Comparator<Map.Entry<String, OpeningTimes>>{
@Override
public int compare(Entry<String, OpeningTimes> o1, Entry<String, OpeningTimes> o2) {
return 0; // what is the logic?
}}
亚军:
public class TestClass {
public static void main(String[] args) {
Map<String, OpeningTimes> openingTimesMap = new TreeMap<String, OpeningTimes>();
OpeningTimes openTime1 = new OpeningTimes();
openTime1.setOpeningTime("9PM");
openTime1.setClosingTime("10PM");
OpeningTimes openTime2 = new OpeningTimes();
openTime2.setOpeningTime("11PM");
openTime2.setClosingTime("9PM");
OpeningTimes openTime3 = new OpeningTimes();
openTime3.setOpeningTime("13PM");
openTime3.setClosingTime("14PM");
OpeningTimes openTime4 = new OpeningTimes();
openTime4.setOpeningTime("15PM");
openTime4.setClosingTime("13PM");
openingTimesMap.put("Tue", openTime2);
openingTimesMap.put("Thu", openTime4);
openingTimesMap.put("Mon", openTime1);
openingTimesMap.put("Wed", openTime3);
for (Entry<String, OpeningTimes> openingTimesSingle : openingTimesMap.entrySet()) {
System.out.println("Key: " + openingTimesSingle.getKey() + " Value: " + openingTimesMap.get(openingTimesSingle.getKey()));
}
List<Map.Entry<String, OpeningTimes>> list = new ArrayList<Map.Entry<String, OpeningTimes>>(openingTimesMap.entrySet());
Collections.sort(list, new OpeningTimesComparator());
for (Entry<String, OpeningTimes> openingTimesSingle : openingTimesMap.entrySet()) {
System.out.println("Key: " + openingTimesSingle.getKey() + " Value: " + openingTimesMap.get(openingTimesSingle.getKey()));
}
}
}
提前致谢
Enum 将是一个很好的解决方案,否则您必须使用其他一些包含您的自定义订单值的静态地图。
像这样定义一个枚举
enum Week{
SUN,MON,TUE,WED,THU,FRI,SAT
}
创建 EnumMap
的实例并添加条目,当您遍历 keySet
时,将按照枚举
Map<Week, String> map = new EnumMap<Week, String>(Week.class);
map.put(Week.WED, "Wednesday");
map.put(Week.SUN, "Sunday");
map.put(Week.MON, "Monday");
map.put(Week.THU, "Thursday");
map.put(Week.SAT, "Saturday");
map.put(Week.FRI, "Friday");
map.put(Week.TUE, "Tuesday");
for(Week week : map.keySet()){
System.out.println(week + " -- " +map.get(week));
}
输出:
SUN -- Sunday
MON -- Monday
TUE -- Tuesday
WED -- Wednesday
THU -- Thursday
FRI -- Friday
SAT -- Saturday
与我在枚举中定义的顺序相同。当然, EnumMap
仅当您的地图中的键范围有限时才有用且高效,例如在您的情况下一周中的几天。希望这会有所帮助:)
选项 2 :-
这一工作假设 inputKeys
完全由您管理。请注意这一点,因为如果给定键不存在映射,它可能会给您带来 NPE。
private static Map<String,Integer> orderMappings = new HashMap<>();
static{
orderMappings.put("Sunday", 1);
orderMappings.put("Monday", 2);
orderMappings.put("Tuesday", 3);
orderMappings.put("Wednesday", 4);
orderMappings.put("Thursday", 5);
orderMappings.put("Friday", 6);
orderMappings.put("Saturday", 7);
}
class OrderComparator implements Comparator<String>{
@Override
public int compare(String key1, String key2) {
int p1 = orderMappings.get(key1);
int p2 = orderMappings.get(key2);
return p1-p2;
}
}