как отсортировать этот список? - PullRequest
2 голосов
/ 21 октября 2010

У меня есть список строк

ArrayList<String> list = new ArrayList<String>();

с каждого предмета:

list.add(week+" "+year);

, где week и year - целые числа.

Как отсортировать этот список по возрастанию?

Ответы [ 10 ]

10 голосов
/ 21 октября 2010

Я рекомендую создать структуру данных, которая содержит данные, которые вы хотите, и реализует сопоставимые.

class WeekOfYear implements Comparable<WeekOfYear> {
    private int week ;
    private int year ;
    public WeekOfYear(int week, int year) {
        this.week = week ;
        this.year = year ;
    }
    /**
     * ...
     */
    public int compareTo(WeekOfYear other) {
        int delta = this.year - other.year ;

        return (int)Math.signum(
                delta != 0 ? delta : (this.week - other.week));
    }

    @Override
    public String toString() {
        StringBuilder builder = new StringBuilder() ;
        builder.append(week > 9 ? "" : "0") ;
        builder.append(week).append(" ") ;
        builder.append(year) ;

        return builder.toString();
    }
}

List<WeekOfYear> weeks ;
weeks = new ArrayList<WeekOfYear>();
Collections.sort(weeks) ;
5 голосов
/ 21 октября 2010

Вам нужно написать компаратор, который разделяет неделю и год, сравнивая год до недели (если поля года равны).Кстати, вы должны поместить неделю и год в объект, чтобы избежать разделения.

3 голосов
/ 21 октября 2010
Collections.sort(list, new Comparator<String>() {
  public int compare(String a, String b) {
    // Your string ordering logic here. (I won't write that for you.)
  }
});
2 голосов
/ 21 октября 2010

Реализация компаратора для сравнения выведенных значений недели и года. Используйте этот компаратор для сортировки списка. Это должно работать. Пример реализации приведен ниже

class WeekYearComparator implements Comparator throws NumberFormatException{
 public int compare(Object weekYr1, Object weekYr2){

 String[] tokens1 = ((String)weekYr1).split(" ");
 int week1 = Integer.parseInt(tokens1[0].trim());
 int year1 = Integer.parseInt(tokens1[1].trim());

 String[] tokens2 = ((String)weekYr2).split(" ");
 int week2 = Integer.parseInt(tokens2[0].trim());
 int year2 = Integer.parseInt(tokens2[1].trim());

 if( year1 > year2)
  return 1;
 else if( year1 < year2)
  return -1;
 else if(year1 = year2){
   if(week1 > week2)
    return 1;
   if(week1 < week2)
    return -1;
   if(week1 == week2)
    return 0;
 }

}

Arrays.sort(list, new WeekYearComparator);
1 голос
/ 21 октября 2010
List<String> weeks = new ArrayList<String>();
weeks.add(1 + " " + 1958);
weeks.add(32 + " " + 2007);
weeks.add(32 + " " + 1999);

Collections.sort(weeks, new Comparator<String>()
{
  public int compare(String o1, String o2)
  {
    int y1 = Integer.parseInt(o1.substring(o1.indexOf(" ") + 1));
    int y2 = Integer.parseInt(o2.substring(o2.indexOf(" ") + 1));
    if (y1 == y2)
    {
      int w1 = Integer.parseInt(o1.substring(0, o1.indexOf(" ")));
      int w2 = Integer.parseInt(o2.substring(0, o2.indexOf(" ")));
      return w1 - w2;
    }
    return y1 - y2;
  }
});

System.out.println("weeks = " + weeks);
0 голосов
/ 21 октября 2010

Общее решение:

public static <T> void sort(List<T> list, final List<Comparator<T>> comparatorList) {  
       if (comparatorList.isEmpty()) {//Always equals, if no Comparator.  
            throw new IllegalArgumentException("comparatorList is empty.");  
       }  
       Comparator<T> comparator = new Comparator<T>() {  
       public int compare(T o1, T o2) {  
               for (Comparator<T> c:comparatorList) {  
                   if (c.compare(o1, o2) > 0) {  
                     return 1;  
                   } else if (c.compare(o1, o2) < 0) {  
                     return -1;  
                   }  
               }  
               return 0;  
         }  
       };  
       Collections.sort(list, comparator);  
  }  
0 голосов
/ 21 октября 2010

Создайте список объектов Календаря, используя YEAR и WEEK_OF_YEAR.Сортируйте это, а затем преобразуйте результат в список строк.

0 голосов
/ 21 октября 2010

Если вы хотите отсортировать по хронологическому порядку, вам придется либо поменять местами год и неделю, чтобы они составляли year+" "+week, затем выполнить простую буквенно-цифровую сортировку, либо написать свой собственный Comparator, который принимает два элемента изlist и сообщает, какой из них стоит первым.

Также рассмотрите возможность создания класса с атрибутами недели и года.Используйте объекты этого класса для хранения значений вашей недели / года, а затем вы можете выводить их любым удобным вам способом, кроме того, вам будет проще сортировать.

0 голосов
/ 21 октября 2010

Если вы просто хотите отсортировать по строковому значению (в алфавитном порядке):

Collections.sort(list);

Если вы хотите отсортировать в хронологическом порядке, вы можете реализовать собственный Comparator и передать его в метод сортировки:

public class MyComparator implements Comparator<String> {
    public int compare(String first, String second) {
        // Split the string and compare the ints here
    }

    public bool equals(Object o) {
        return this == o;
    }
}

А потом:

Collections.sort(list, new MyComparator());
0 голосов
/ 21 октября 2010
Arrays.sort(list);

или Arrays.sort (список, Collections.reverseOrder ());

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