【问题标题】:Sort String ArrayList Numerically in Java Android在 Java Android 中对字符串 ArrayList 进行数值排序
【发布时间】:2016-06-07 14:54:45
【问题描述】:

我有一个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公斤

我应该如何排序。

【问题讨论】:

  • 您需要弄清楚如何将所有内容转换为通用单位,例如克;然后比较数值。

标签: java sorting arraylist


【解决方案1】:

您需要一个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

【讨论】:

  • 您可能希望使用return Integer.compare(weight1, weight2); 创建您的result
  • weight1weight2String 值。相信我,我不喜欢写这个,但这是唯一的方法:)
  • 我的意思是 val1val2 ;P.
  • @Tom ... 和 Double.compare,可能:P
  • @Arjan 是的,确实......所以我的第一条评论有正确的意图,但充满了错误^^。
【解决方案2】:

如果您真的想对值的 String 表示进行排序,而不是协调数据中的值(例如,全部以克为单位)并仅按值的自然顺序对它们进行排序,则需要做很多工作。

  1. 使用Comparator&lt;String&gt; - 有关 API,请参阅here。在对List(API here)进行排序时,您将在调用Collections.sort 时注入它。
  2. 在您的 compare 方法中,通过正则表达式从每个 String 中解析两件事:一个数字(实数或整数,取决于您的数据)和一个测量单位(可能基于定义 gram 的所有变体的地图) 、公斤等)
  3. 然后比较测量单位(可能使用另一个Comparator&lt;String&gt;!)并将解析的数字转换为单个单位的值(可能是克等)
  4. 在将它们转换为实际数字(例如Integers 或Doubles 等)后,最后比较协调后的数值 - 这次使用它们的自然顺序

“可选”,处理所有边缘情况:null 或空值、Strings 不包含数字表示或测量单位、模糊值等。

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

      【解决方案4】:

      @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);
      

      【讨论】:

      • “如果你愿意,我认为你也可以使用 Java 8。” 好吧,我希望 Java 8 更多,而不仅仅是打印排序列表的流:D .例如使用它对列表进行实际排序。
      • @Tom 哦,是的,我想是的,你的意思是过滤器和其他的
      • 好吧,filter 可能不是必需的,但是是的,类似的东西 :D。或者至少 Collections.sort(where, (o1, o2) -&gt; { 而不是 Collections.sort(where, new Comparator&lt;String&gt;() { @Override public int compare(String o1, String o2) { :D.
      【解决方案5】:

      只需使用indexfor 循环,

      for(int i=0; i<where.size(); i++){
         System.out.println(where.get(i));
      }
      

      【讨论】:

      • 请重新阅读问题。您的回答并不能解决 OP 的要求。
      • OP 有一定数量的带有数字和权重的字符串。他想根据它们的数量和重量对这些列表项进行排序(“kg”比“gram”重)。您的代码只是迭代其他列表并忽略排序部分。是的,OP 示例具有误导性。
      • @DmitriyPolovinkin 他想排序它:How should i sort it. 它已经排序了——只是巧合。
      猜你喜欢
      • 2017-06-07
      • 2012-10-14
      • 2015-10-16
      • 1970-01-01
      • 2011-08-14
      • 2014-12-07
      • 2016-09-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多