在Java Android中以数字方式排序字符串ArrayList

时间:2016-06-07 14:54:46

标签: java sorting arraylist

我有ArrayList定义如下:

List<String> where = new ArrayList<String>();
where.add("1 Kg");
where.add("500 gram");
where.add("5 Kg");

当我显示此列表时,显示的值显示为:

  

1公斤   500克
  5公斤

我希望它显示如下:

  

500克
  1公斤   5公斤

我应该如何排序。

5 个答案:

答案 0 :(得分:3)

您需要Comparator来编写比较逻辑。

请参阅以下实施。

package test;

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

public class Test {
    public static void main(String[] args) {
        List<String> where = new ArrayList<String>();
        where.add("5 Kg");
        where.add("500 gram");
        where.add("1 Kg");

        Collections.sort(where, new MassComparator());

        for(String mass : where) {
            System.out.println(mass);
        }
    }

    public static class MassComparator implements Comparator<String> {

        @Override
        public int compare(String weight1, String weight2) {
            double val1 = Double.parseDouble(weight1.replace("gram", "").replace("Kg", "").trim());
            double val2 = Double.parseDouble(weight2.replace("gram", "").replace("Kg", "").trim());

            if (weight1.contains("gram")) {
                val1 *= .001;
            }

            if (weight2.contains("gram")) {
                val2 *= .001;
            }

            int result = 0;

            if (val1 < val2) {
                result = -1;
            } else if (val1 > val2) {
                result = 1;
            }

            return result;
        }

    }
}

<强>输入

List<String> where = new ArrayList<String>();
where.add("500 gram");
where.add("2 Kg");

<强>输出

500 gram
2 Kg

答案 1 :(得分:1)

如果你真的想要对值的String表示进行排序,而不是统一数据中的值(例如以克为单位)并按照值的自然顺序对它们进行排序,那么你需要做一些工作。

  1. 使用Comparator<String> - 请参阅here了解API。在对Collections.sort(API here)进行排序时,您会在调用List时注入此内容。
  2. compare方法中,通过正则表达式解析每个String中的两个内容:数字(实数或整数,取决于您的数据)和测量单位(可能基于定义的地图)克,千克等的所有变种。)
  3. 然后比较测量单位(可能使用另一个Comparator<String>!)并将解析后的数字转换为单个单位的值(可能是克等)
  4. 最后将协调后的数值转换为实际数字后进行比较(例如Integer s或Double s等) - 这次使用它们的自然顺序
  5. “可选”,处理所有边缘情况:null或空值,String不包含数字表示或测量单位,模糊值等。

答案 2 :(得分:0)

将您的值存储为Double,如下所示

List<Double> where = new ArrayList<Double>();
where.add(0.5);
where.add(1);
where.add(5);

您可以在上面的列表中应用排序, 在检索时,如果您的应用程序要求允许,您可以使用0.5公斤而不是500克。

答案 3 :(得分:0)

Mr @ 11thdimension已经提供了一个完美的解决方案。我想如果你愿意,你也可以使用Java 8。基本上相同的想法,但代码较少。

List<String> where = new ArrayList<String>();
    where.add("1 Kg");
    where.add("500 gram");
    where.add("5 Kg");

    Collections.sort(where, new Comparator<String>() {
        @Override
        public int compare(String o1, String o2) {
            double a = (Double.parseDouble(o1.replace("gram","").replace("Kg","").trim()))*(o1.contains("gram")?0.001:1);
            double b = (Double.parseDouble(o2.replace("gram","").replace("Kg","").trim()))*(o2.contains("gram")?0.001:1);
            return Double.compare(a,b) ;
        }
    });
    where.stream().forEach(System.out::println);

答案 4 :(得分:-1)

只需使用$.getJSON("https://opendata.rdw.nl/resource/m9d7-ebf2.json",{kenteken: kenteken},function(data, status){ alert("Merk: " + data[0].merk + " Handelsbenaming: " + data[0]. handelsbenaming + " Status: " + status);}); }); index周期,

for