2016-06-07 64 views
-3

我有一个ArrayList定义如下:排序字符串的ArrayList数控在Java中的Android

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

当我显示该列表,值示出被示出为:

1公斤
500克
5 Kg

我希望它显示如下:

500克
1公斤
5公斤

我应该如何排序。如下图所示

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

+3

您需要弄清楚如何将所有东西都转换成一个通用单元,例如,克;然后比较这些数值。 –

回答

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 
+0

你可能想用'return Integer.compare(weight1,weight2);'来创建'result'。 – Tom

+0

'weight1'和'weight2'是'String'值。相信我我不喜欢这样写,但这是唯一的方法:) – 11thdimension

+0

我的意思是'val1'和'val2'; P。 – Tom

0

存储你的价值观为Double你可以申请上述列表排序上, 也在检索您可以使用0.5公斤代替500克,如果你的应用程序要求允许它的时间。

1

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

  1. 使用Comparator<String> - 请参阅here获取API。在排序List(API here)时,您将在调用Collections.sort时注入此信息。
  2. 在您的compare方法中,通过正则表达式解析每个String中的两件事:一个数字(实数或整数,取决于您的数据)和一个测量单位(可能基于定义所有克,千克等变体的映射) 。)
  3. 然后比较测量单元(可能使用另一Comparator<String>!)和经解析的数字将它们转换为实际后转换为它们的值为单个单元(可能克等)
  4. 最后比较统一数值数字(如Integer s或Double s等) - 这次使用它们的自然顺序

“可选”,处理所有的边缘情况:null或空值,String不是包含一个数字表示或测量单元,暧昧值,等等,等等

-1

只是使用indexfor周期,

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

请重新阅读这个问题。你的回答并不能解决OP所要求的。 – Tom

+0

他想要得到它,什么是错的? –

+0

OP有一定数量和重量的字符串。他想根据它们的数量和重量对这些列表项进行分类(“kg”比“克”更重)。您的代码只是迭代其他列表并忽略排序部分。是的,OP的例子是误导性的。 – Tom

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); 
+0

*“我认为你也可以使用Java 8,如果你愿意的话。”*我期待更多的Java 8,而不仅仅是打印排序后的List的流:D。例如使用它来实际排序列表。 – Tom

+0

@Tom噢是的,我认为是这样,你的意思是过滤器和其他 –

+0

那么,'过滤器'可能不是必要的,但是,是这样的东西:D。或者至少'Collections.sort(其中,(o1,o2) - > {'而不是'Collections.sort(其中,新比较器(){@Override public int compare(String o1,String o2){':D – Tom