【问题标题】:Custom sort on ArrayList for days of the week一周中几天对 ArrayList 的自定义排序
【发布时间】:2020-07-11 00:44:32
【问题描述】:

我希望对一个字符串数组列表进行排序,以使所有星期一都在列表的开头,所有星期五都在列表的末尾。例如,

days.add("Thursday");
days.add("Monday");
days.add("Friday");
days.add("Wednesday");
days.add("Thursday");
days.add("Thursday");

我希望输出如下;

"Monday"
"Wednesday"
"Thursday"
"Thursday"
"Thursday"
"Friday"

我这样做是因为我需要绘制结果图表,并且我希望图表按此顺序排列。我在想也许使用映射来放置 Monday, 1 : Tuesday, 2 等并以这种方式进行比较,但我不知道是否有更简单的方法。非常感谢任何帮助谢谢!

【问题讨论】:

  • 如果您只需要在项目上放置索引,您可以将它们放在列表或数组中。就像如果您有一个列表 List.of("orange","black","yellow") 那么由于列表的索引,您会自动获得橙色:0,黑色:1,黄色:2。而不是 Map.of("orange",0,"black",1,"yellow",2),您可以在其中执行 get(color) 来获取索引,使用列表您可以执行indexOf(color)

标签: java sorting arraylist


【解决方案1】:

您可以通过实现 Comparable 接口方法 compareTo 或 Comparator 接口比较方法来使用自定义排序
这应该会有所帮助
Sort ArrayList of custom Objects by property

更新:你可以制作这样的哈希图

HashMap<String , Integer> rank = new HashMap<>();
rank.put("Monday" , 1);
rank.put("Tuesday" , 2);
.
.
and so on..

现在只需使用自定义比较器,根据 rank.get(currentDay) 进行排序

Collections.sort(days , new thisway(rank));

然后实现Comparator接口比较方法

class thisway implements Comparator<String>{

    private HashMap<String, Integer> rank;

    thisway(HashMap<String , Integer> hashmap){
        this.rank = hashmap;
    }

    @Override
    public int compare(String a , String b){
       if(rank.get(a).intValue() < rank.get(b).intValue()){
           return -1;
       }
       if(rank.get(a).intValue() == rank.get(b).intValue()){
           return 0;
       }
       return 1;
    }
}

我想这应该会有所帮助。

【讨论】:

  • 我试过这个,但它只是按字母顺序正确吗?所以就像星期五在那种情况下最终会成为第一个@mss
  • @RonanD1807 更新我的答案
【解决方案2】:

您可以在一周中的几天使用枚举,因为每个枚举下面都有自己的值。

public enum DayOfTheWeek {
    Monday, //default value of 0
    Tuesday, //default value of 1
    Wednesday, //default value of 2
    Thursday, 
    Friday,
    Saturday,
    Sunday
}

然后只需制作 DayOfTheWeek 的 ArrayList 并使用 Collections.sort()。

    ArrayList<DayOfTheWeek> days = new ArrayList<>();
    days.add(DayOfTheWeek.valueOf("Friday"));
    days.add(DayOfTheWeek.valueOf("Monday"));
    days.add(DayOfTheWeek.valueOf("Saturday"));
    days.add(DayOfTheWeek.valueOf("Sunday"));
    Collections.sort(days);

【讨论】:

  • 这是一个很好的解决方案,但不幸的是,这些天我填充的数组列表来自数据库作为字符串,所以如果你知道我没有能力将其更改为 DayOfWeek.day是在说什么?
  • @RonanD1807 是的,您可以只使用 DayOfTheWeek.valueOf("Friday") 而不是 DayOfTheWeek.Friday
  • 在调用 valueOf 时设置为 "Friday".toUpperCase()
【解决方案3】:

这样的事情很容易做到:

days.sort(Comparator.comparing(day -> List.of("Monday","Tuesday","Wednesday", "Thursday","Friday","Satursday","Sunday").indexOf(day)));

但将List.of("Monday","Tuesday","Wednesday", "Thursday","Friday","Satursday","Sunday") 设为常量以避免每次都重新创建它。

【讨论】:

  • 这需要分两行完成。首先,List&lt;String&gt; orderedDays = List.of(…),然后在 lambda 中使用 orderedDays。为每一个比较创建一个全新的、相同的列表是非常低效的。
  • 列表需要被提取成一个常量,将其作为比较之前的一行代码也是低效的。我确实已经这么说了。
【解决方案4】:

您可以通过这种方式使用DayOfWeek 类定义自定义Comparator

Comparator<String> comparator = new Comparator<String>() {

    @Override
    public int compare(String day1, String day2) {
        return Integer.compare(DayOfWeek.valueOf(day1.toUpperCase()).getValue(),
                               DayOfWeek.valueOf(day2.toUpperCase()).getValue());
    }
};

在你的代码之后,你可以像下面这样调用它:

List<String> days = new ArrayList<String>();
days.add("Thursday");
days.add("Monday");
days.add("Friday");
days.add("Wednesday");
days.add("Thursday");
days.add("Thursday");
Collections.sort(days, comparator);
System.out.println(days); // will print [Monday, Wednesday, Thursday, Thursday, Thursday, Friday]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-10-07
    • 1970-01-01
    • 2021-12-05
    • 2019-07-26
    • 2010-12-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多