使用数值java对字符串数组进行排序

时间:2015-04-27 09:12:02

标签: java string sorting arraylist double

我有一个计算货币和股票价值之间相关值的程序。我正在添加"对" (货币名称+":" +相关值)到ArrayList中,如果我打印出arraylist,这是我的输出:

SDG: 0.6672481089755959
RON: 0.7950474904606127
MKD: 0.788195252851783
MXN: 0.8429550156320716
CAD: 0.7777753208834005
ZAR: 0.8254509631193871

我试图通过一种聪明的方式来按相关值对它们进行排序,从最大到最小,但不能想到这样做的好方法。有什么想法吗?

4 个答案:

答案 0 :(得分:4)

你可以有三种方法:

  1. Collections.sort与自定义比较器一起使用,该比较器将字符串分割为:(并修剪它),然后返回字符串数字部分的.compareTo值。

  2. 创建一个新对象,可以称之为CurrencyCorrelation,它有2个属性(currencyNamecorrelation可能?)。该类将实现Comparable接口并覆盖toString()方法以产生您想要的相关性(currencyName + ": " + String.valueOf(correlation))。然后,根据选项1,您无需指定比较器即可调用Collections.sort(...)

  3. 根据@Sasha Salauyou的建议,您也可以根据选项2声明该类,然后使用Java 8 lamba表达式来定义comaparator,而无需让您的类扩展Comparable接口。这看起来像这样:list.sort((e1, e2) -> e1.getCorrelation().compareTo(e2.getCorrelation()))

  4. 第二个选项可能会更好,第一个选项需要更少的更改。

答案 1 :(得分:0)

您可以将它们存储在已排序的TreeMap中。来自Docs:

地图根据其键的自然顺序排序,或者根据使用的构造函数在地图创建时提供的比较器进行排序。

答案 2 :(得分:0)

假设你的元素是字符串并且相关值是双倍的,你可以简单地编写自己的比较器并进行排序:

Collections.sort(al, new Comparator<String>() {

    @Override
    public int compare(String s1, String s2) {

        double d1 = Double.parseDouble(s1.substring(s1.indexOf(": ") + 2));
        double d2 = Double.parseDouble(s2.substring(s2.indexOf(": ") + 2));

        return Double.compare(d1, d2);
    }

});

答案 3 :(得分:0)

/** Immutable class holding currency-correlation pair */
public static class CurrencyCor {

    public final String currency;
    public final Double correlation;

    private CurrencyCor(String cur, Double cor) {
        if (cur == null || cor == null) 
            throw new NullPointerException("Null argument(s)");
        currency = cur;
        correlation = cor;
    }

    @Override
    public String toString() {
         return String.format("%s: %s", currency, correlation)
    }
}

// ...

List<CurrencyCor> list = new ArrayList<>();
list.add(new CurrencyCor("SDG", 0.6672481089755959));
list.add(new CurrencyCor("ZAR", 0.8254509631193871));
// ... add remaining pairs

list.sort((e1, e2) -> e1.correlation.compareTo(e2.correlation)); // sort by correlation value
list.forEach(System.out::println);   // print out sorted pairs