Выборочная сортировка по ArrayList по дням недели - PullRequest
2 голосов
/ 30 марта 2020

Я хочу отсортировать массив строк, чтобы они были такими, чтобы все понедельники были в начале списка, а все пятницы - в конце. Например,

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

Я бы хотел, чтобы это выглядело следующим образом:

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

Я делаю это, так как мне нужно построить график результатов, и я бы предпочел, чтобы график был в этом порядке. Я подумал, может быть, используя сопоставление, чтобы поместить понедельник, 1: вторник, 2 и c и сравнить таким образом, но я не знаю, есть ли более простой способ. Спасибо за любую помощь. Спасибо!

Ответы [ 4 ]

2 голосов
/ 30 марта 2020

Вы можете использовать Enum для дней недели, поскольку под каждым из перечислений есть свои собственные значения.

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

Затем просто создайте ArrayList для DayOfTheWeek и используйте 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);
1 голос
/ 30 марта 2020

Вы можете использовать пользовательскую сортировку с помощью реализации метода сравнения Comparable интерфейс сравнения или метода сравнения интерфейса Comparator
Это должно помочь
Сортировать ArrayList пользовательских объектов по свойству

Обновление : вы можете создать хеш-карту, подобную этой

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;
    }
}

Полагаю, это должно помочь.

0 голосов
/ 30 марта 2020

Вы можете определить пользовательский Comparator, используя класс DayOfWeek следующим образом:

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]
0 голосов
/ 30 марта 2020

Что-то вроде этого будет легко:

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") константой, чтобы не создавать ее заново каждый раз.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...