字符串值时区排序

时间:2016-12-23 09:12:31

标签: java sorting collections

我想对包含时区值的字符串值进行排序,以便我实现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

我想跳过String转换为整数。整数对话是我的最后一个选择。

4 个答案:

答案 0 :(得分:1)

您当前的排序基于字符串值,以递减的方式。在标准字符集中(如Ascii或UTF-8),+符号位于-之前,这就是为什么所有以-开头的字符串都位于以+开头的字符串之前,这就是给定标志的原因,字符串正在下降。

您应该在compareTo方法中添加更多逻辑。有几种方法可以做到这一点。您可以首先比较第一个字符,以根据符号对字符串进行排序。如果符号不同,您已经知道订单,如果符号等于那么:

  • 如果符号为-,请保留您的代码;
  • 如果符号+反转您的代码。

答案 1 :(得分: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);
}

我所做的是比较我将String值转换为Double而不会丢失signminutes值。我使用了String.replace方法。 (即删除+ - :

答案 2 :(得分:0)

对于timeZoneModelList,您可以使用Arrays.sort()代替Collections.sort(),但也许可以更改输出:

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

答案 3 :(得分: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());
        }
    }
}

你可能已经说过你不想转换为Integers,但是这种方法是错误的,正如你所看到的,使这项工作所需的代码非常复杂。