2016-12-23 7 views
0

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

import java.util.ArrayList; 
import java.util.Collection; 
import java.util.Collections; 
import java.util.List; 

public class TimeZoneModel implements Comparable { 
    private Integer id; 
    private String value; 

    public int getId() { 
     return id; 
    } 

    public String getValue() { 
     return value; 
    } 

    public void setId(Integer id) { 
     this.id = id; 
    } 

    public void setValue(String value) { 
     value = value; 
    } 

    public TimeZoneModel(String value){ 
     this.value= value; 
    } 

    public int compareTo(Object object) { 
     TimeZoneModel timezoneModel= null; 

     if(object instanceof TimeZoneModel){ 
      timezoneModel=(TimeZoneModel)object; 
     } 

     return /*value.compareTo*/((timezoneModel.getValue()!=null?timezoneModel.getValue():"")).compareTo(value); 
    } 

    public static void main(String args[]){ 
     TimeZoneModel timezoneModel = new TimeZoneModel("+01:00"); 
     TimeZoneModel timezoneModel1 = new TimeZoneModel("+02:30"); 
     TimeZoneModel timezoneModel2 = new TimeZoneModel("-01:00"); 
     TimeZoneModel timezoneModel3 = new TimeZoneModel("-11:00"); 
     TimeZoneModel timezoneModel4 = new TimeZoneModel("+05:00"); 

     List<TimeZoneModel> timeZoneModelList = new ArrayList<TimeZoneModel>(); 
     timeZoneModelList.add(timezoneModel); 
     timeZoneModelList.add(timezoneModel1); 
     timeZoneModelList.add(timezoneModel2); 
     timeZoneModelList.add(timezoneModel3); 
     timeZoneModelList.add(timezoneModel4); 

     Collections.sort(timeZoneModelList); 

     for(TimeZoneModel timezoneModelw : timeZoneModelList){ 
      System.out.println(timezoneModelw.getValue()); 
     } 
    } 
} 

В вышеуказанной программе я хочу сделать обычную сортировку на основе значений. Для этого я использовал сопоставимый интерфейс.

Выход я получаю:

-11:00 
-01:00 
+05:00 
+02:30 
+01:00 

Ожидаемый результат:

-11:00 
-01:00 
+01:00 
+02:30 
+05:00 

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

ответ

1

Используйте следующую версию compareTo метода

@Override 
    public int compareTo(Object object) { 

    TimeZoneModel timezoneModel = null; 

    Double val1 = 0d; 
    Double val2 = 0d; 

    if (object instanceof TimeZoneModel) { 
     timezoneModel = (TimeZoneModel) object; 

     String strVal = timezoneModel.getValue(); 

     if (strVal != null) { 

      strVal = strVal.replace(":", "."); 

      if (strVal.contains("-")) { 

       val1 = Double.valueOf(strVal.replace("-", "")); 
       val1 = val1 * -1; 

      } else { 
       val1 = Double.valueOf(strVal.replace("+", "")); 
      } 

     } 

     String value = this.value.replace(":", "."); 

     if (value.contains("-")) { 

      val2 = Double.valueOf(value.replace("-", "")); 
      val2 = val2 * -1; 

     } else { 
      val2 = Double.valueOf(value.replace("+", "")); 
     } 

    } 

    return val2.compareTo(val1); 
} 

То, что я сделал для сравнения я преобразовал значение строки Double без потери sign и значения minutes. Для этого я использовал метод String.replace. (т.е. для удаления + - :)

1

Ваш текущий вид основан на значении String по нисходящей линии. В стандартной кодировке (как Ascii или UTF-8) знак + находится перед -, поэтому все ваши строки, начинающиеся с -, находятся перед теми, что начинаются с +, и поэтому для данного знака нисходящие строки.

Вы должны добавить больше логики в свой метод compareTo. Есть несколько способов сделать это. Сначала вы можете сравнить первый символ, чтобы отсортировать строки в зависимости от их знаков. Если знаки отличаются, вы уже знаете порядок, и если знаки равно тогда:

  • если знак - затем сохранить свой код;
  • если знак + инвертирует ваш код.
0

для timeZoneModelList вы можете использовать Arrays.sort() вместо Collections.sort() но, возможно, изменить такой вывод:

+01:00 
+02:30 
+05:00 
-01:00 
-11:00 
0

Как Val Bonn заметил, есть разные случаи, основываясь на знаке. Если числа отрицательные, то «большее число» меньше, тогда как если числа как положительные, «меньшее число меньше».

Если знаки разные, отрицательный всегда меньше положительного.

Так что ваш код становится чем-то вроде этого:

import java.util.ArrayList; 
import java.util.Collection; 
import java.util.Collections; 
import java.util.List; 

public class TimeZoneModel implements Comparable { 
    private Integer id; 
    private String value; 

    public int getId() { 
     return id; 
    } 

    public String getValue() { 
     return value; 
    } 

    public void setId(Integer id) { 
     this.id = id; 
    } 
    public void setValue(String value) { 
     value = value; 
    } 

    public TimeZoneModel(String value){ 
     this.value= value; 
    } 

    public int compareTo(Object object) { 
     TimeZoneModel timezoneModel= null; 
     if(object instanceof TimeZoneModel){ 
      timezoneModel=(TimeZoneModel)object; 
     } 
     // need to handle timezoneModel being null 
     if (timezoneModel.getValue() != null) { 
      char sign = timezoneModel.getValue().charAt(0); 
      if (sign == '+') { 
       if (value.charAt(0) == '+') 
        return value.compareTo(timezoneModel.getValue()); 
       else 
        return -1; 
      } 
      else if (sign == '-') 
       if (value.charAt(0) == '-') 
        return - value.compareTo(timezoneModel.getValue()); 
       else 
        return 1; 
     } 
     return "".compareTo(value); 
    } 

    public static void main(String args[]){ 
     TimeZoneModel timezoneModel = new TimeZoneModel("+01:00"); 
     TimeZoneModel timezoneModel1 = new TimeZoneModel("+02:30"); 
     TimeZoneModel timezoneModel2 = new TimeZoneModel("-01:00"); 
     TimeZoneModel timezoneModel3 = new TimeZoneModel("-11:00"); 
     TimeZoneModel timezoneModel4 = new TimeZoneModel("+05:00"); 

     List<TimeZoneModel> timeZoneModelList = new ArrayList<TimeZoneModel>(); 
     timeZoneModelList.add(timezoneModel); 
     timeZoneModelList.add(timezoneModel1); 
     timeZoneModelList.add(timezoneModel2); 
     timeZoneModelList.add(timezoneModel3); 
     timeZoneModelList.add(timezoneModel4); 

     Collections.sort(timeZoneModelList); 
     for(TimeZoneModel timezoneModelw : timeZoneModelList){ 
      System.out.println(timezoneModelw.getValue()); 
     } 
    } 
} 

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