2016-12-23 9 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); 
} 

の以下のバージョンを使用して、私はsignminutes価値を失うことなくDoubleに文字列値を変換し比較するためです。私は同じためにString.replaceメソッドを使用しています。 (即ち、+ - :を除去するため)

1

現在の並べ替えは、降順で文字列値に基づいています。標準の文字セット(AsciiまたはUTF-8)では、+の符号は-より前です。そのため、-で始まるすべての文字列が+で始まる文字列の前にあるため、指定された符号に対して文字列が降順です。

compareToメソッドでロジックを追加する必要があります。それを行うにはいくつかの方法があります。最初に、最初の文字を比較して、記号の関数で文字列をソートすることができます。兆候が異なる場合は、すでに秩序を知っており、その兆候が等しい場合は:

  • 記号が-の場合は、コードを保管してください。
  • 符号が+の場合は、コードを反転します。
0

timeZoneModelListのためにあなたは、Arrays.sort()代わりCollections.sort()を使用することができますが、多分それは次のように出力を変更:ヴァルボンが気づいたとおり、符号に基づいて、異なる場合がある

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

。数字が負の場合は「大きい数字」が少なくなり、正数の場合は「小さい数字が小さい」となります。

記号が異なる場合は、負の値は常に正の値よりも小さくなります。

だからあなたのコードは次のようになり:

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

あなたは整数に変換しないと述べているかもしれないが、このアプローチは間違っている、とのコードは、この作品を作るために必要な、などあなたが見ることができる、非常に複雑です。