【问题标题】:Sorting an arraylist sorted by a value keeping the sorting对按保持排序的值排序的数组列表进行排序
【发布时间】:2019-08-18 14:59:53
【问题描述】:

我有一个对象的 ArrayList,在每个对象中我都有一个日期和一个小时,我已将其转换为 int 进行排序。 我已经按日期对对象列表进行了排序,现在我想按小时对相同的数组列表进行排序,保持日期的排序。

一个小例子:

我有一个带有方法的事件对象 getDateEvent() 和 getHourEvent() 返回可排序的数据和小时值,如 YYYYMMDD 和 HHMM

并且一个事件数组列表已经按日期排序,所以我必须按小时对数组列表进行排序,保持日期排序。

我的代码实际上是这样的:

private ArrayList<Evento> SortingHour(ArrayList<Evento> SortingList){
    int t=0;
    int counter=0;
    ArrayList<Evento> finale = new ArrayList<>();
    ArrayList<Evento>[] Array =  new ArrayList[SortingList.size()];
    while(counter<SortingList.size()){
        if( SortingList.get(counter).getDateEvent()).equals(SortingList.get(counter+1).getDateEvent()))) {
            Array[t].add(SortingList.get(counter));
            Array[t].add(SortingList.get(counter+1));
            counter++;

        }else{
            t++;
        Array[t].add(SortingList.get(counter));}

        counter++;
        }

            for(int c=0;c<t;c++) {
                for (int c1 = 0; c1 < Array[c].size(); c1++) {
                    for (int c2 = 0; c2 < Array[c].size(); c2++) {
                        if (Integer.parseInt(Array[c].get(c1).getHourEvent()) < Integer.parseInt(Array[c].get(c2).getHourEvent())) {
                            Collections.swap(Array[c], c1, c2);
                        }

                    }
                }
            }
        for(int c=0; c<t;c++){
            finale.addAll(Array[c]);
        }

    return finale;
    }

【问题讨论】:

标签: java android


【解决方案1】:

试试这样的:

public ArrayList<Item> sort(List<Item> list) {

    ArrayList<Item> dateSort= new ArrayList<>();
    ArrayList<Item> result = new ArrayList<>();

    if (list!= null && list.size() != 0) {

      dateSort= new ArrayList<>(list);

      Collections.sort(
          dateSort, (o1, o2) -> Integer.compare(o1.getIntDate(), o2.getIntDate()));

      int currentDate = dateSort.get(0).getIntDate();

      ArrayList<Item> temp= new ArrayList<>();

      for (int i = 1; i < dateSort.size(); i++) {

        if (dateSort.get(i).getIntDate() > currentDate ) {
          currentDate = dateSort.get(i).getIntDate();
          result.addAll(timeSort(temp));
          temp.clear();
          temp.add(dateSort.get(i));
        }
        else{
          temp.add(dateSort.get(i));
        }

      }
    }
    return result;
  }

private ArrayList<Item> timeSort(List<Item> list) {

  ArrayList<Item> timeSort= new ArrayList<>();
  if (list!= null && list.size() != 0) {

      timeSort= new ArrayList<>(list);

      Collections.sort(
          timeSort, (o1, o2) -> Integer.compare(o1.getIntTime(), o2.getIntTime()));

  }

  return timeSort;
}

【讨论】:

    【解决方案2】:

    我创建了以下示例,

    public class Timings {
    
        private LocalDate date;
        private int hour;
    
        public Timings(LocalDate date, int hour) {
            this.date = date;
            this.hour = hour;
        }
    
        public LocalDate getDate() {
            return date;
        }
    
        public int getHour() {
            return hour;
        }
    
        @Override
        public String toString() {
            return "Timings{" +
                    "date=" + date +
                    ", hour=" + hour +
                    '}';
        }
    }
    
    public class Sorting {
    
        public static void main(String[] args) {
    
            LocalDate date = LocalDate.of(2015, 02, 20);
            LocalDate date1 = LocalDate.of(2018, 07, 12);
            LocalDate date2 = LocalDate.of(2017, 05, 10);
    
            Timings timings = new Timings(date, 10);
            Timings timings1 = new Timings(date1, 8);
            Timings timings2 = new Timings(date2, 12);
    
            List<Timings> dateList = List.of(timings, timings1, timings2);
    
            List<Timings> newList = dateList.stream()
                    .sorted( (a1, a2) -> a1.getDate().compareTo(a2.getDate()))
                    .sorted(Comparator.comparingInt(Timings::getHour))
                    .collect(Collectors.toList());
    
            System.out.printf(newList);
    
        }
    }
    

    在上面,第一个排序方法负责根据日期进行排序。第二个按小时照顾。

    我得到了下面的输出

    [Timings{date=2018-07-12, hour=8}, Timings{date=2015-02-20, hour=10}, Timings{date=2017-05-10, hour=12}]
    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-05
      • 1970-01-01
      • 2010-11-18
      • 1970-01-01
      • 2011-02-09
      • 1970-01-01
      相关资源
      最近更新 更多