【问题标题】:Sorting an array of Strings with a numeric value, java用数值对字符串数组进行排序,java
【发布时间】:2015-04-27 09:12:01
【问题描述】:

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

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

我正在尝试一种聪明的方法来按相关值从最大到最小对它们进行排序,但想不出一个好的方法。有什么想法吗?

【问题讨论】:

  • Double 实现了Comparable 接口。因此,您可以使用Collections.sort(List<Double>) 进行排序
  • 您显然需要一个特殊的类,将货币作为枚举(或字符串)和相关值作为双精度值。然后按这个值排序。

标签: java string sorting arraylist double


【解决方案1】:

你可以有三种方法:

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

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

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

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

【讨论】:

  • 将信息编码为字符串的不便之处会越来越多。第二个选项将产生一个更简单、更易于维护的程序。
  • 具有封闭类,OP 将能够仅按 list.sort((e1, e2) -> e1.cor.compareTo(e2.cor)) 排序
  • @SashaSalauyou:感谢您的评论。我已更新我的答案以包含您的建议。
  • 感谢您的回答,我必须尝试执行此操作。请问为什么投反对票,这个问题太宽泛了吗?
  • @AntonHeikinheimo:一个好的问题通常包括问题是什么、你得到了什么以及你期望什么。在你的情况下,你说明你拥有什么以及你想最终得到什么,但不要表现出任何试图为自己解决问题的努力。今后,请牢记这一点。 (但请不要倾倒你的整个代码,一个说明问题所在的小例子通常就足够了。
【解决方案2】:

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

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

【讨论】:

  • 这里他想根据值而不是键来排序。
【解决方案3】:

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

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

});

【讨论】:

    【解决方案4】:
    /** 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                  
    

    【讨论】:

    • @Albert Java 8 于一年多前发布。我认为现在应该将其视为默认设置。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-21
    • 2012-10-14
    • 2017-06-07
    • 2014-08-02
    • 1970-01-01
    相关资源
    最近更新 更多