Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/389.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/sharepoint/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用数值对字符串数组进行排序,java_Java_String_Sorting_Arraylist_Double - Fatal编程技术网

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

使用数值对字符串数组进行排序,java,java,string,sorting,arraylist,double,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 我正试图想出一种聪明的方法,通过相关性值对它

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

SDG: 0.6672481089755959
RON: 0.7950474904606127
MKD: 0.788195252851783
MXN: 0.8429550156320716
CAD: 0.7777753208834005
ZAR: 0.8254509631193871
我正试图想出一种聪明的方法,通过相关性值对它们进行排序,从最大到最小,但想不出一个好方法。有什么想法吗?

你可以把它们储存在一个已经分类好的文件夹中。从文档:


映射根据其键的自然顺序进行排序,或者由映射创建时提供的比较器进行排序,具体取决于使用的构造函数

您可以有三种方法:

  • 使用
    集合。使用自定义比较器对
    进行排序,该比较器将字符串按
    拆分(并对其进行修剪),然后返回字符串数字部分的
    。compareTo

  • 创建一个新对象,可能称之为
    CurrencyCorrelation
    ,它有两个属性(
    currencyName
    correlation
    maybe?)。该类将实现
    Comparable
    接口,并重写
    toString()
    方法,以生成所需的相关性(
    currencyName+”:“+String.valueOf(correlation)
    )。然后调用
    Collections.sort(…)
    ,而无需指定比较器,如选项1所示

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


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

    假设您的元素是字符串,并且相关值是双倍的,您只需编写自己的比较器并进行排序:

    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);
        }
    
    });
    
    Collections.sort(al,新的比较器(){
    @凌驾
    公共整数比较(字符串s1、字符串s2){
    double d1=double.parseDouble(s1.substring(s1.indexOf(“:”)+2));
    double d2=double.parseDouble(s2.substring(s2.indexOf(“:”)+2));
    返回双重比较(d1,d2);
    }
    });
    
    /**持有货币相关对的不可变类*/
    公共静态类CurrencyCor{
    公共最终字符串货币;
    公共最终双重相关;
    专用货币(字符串货币、双货币){
    if(cur==null | | cor==null)
    抛出新的NullPointerException(“Null参数”);
    货币=cur;
    相关性=cor;
    }
    @凌驾
    公共字符串toString(){
    返回字符串。格式(“%s:%s”、货币、相关性)
    }
    }
    // ...
    列表=新的ArrayList();
    增加(新货币(“SDG”,0.6672481089755959));
    增加(新货币(“ZAR”,0.8254509631193871));
    // ... 添加剩余的对
    list.sort((e1,e2)->e1.correlation.compareTo(e2.correlation));//按相关值排序
    list.forEach(System.out::println);//打印出已排序的对
    
    Double
    实现了
    可比较的
    接口。因此,您可以使用
    Collections.sort(List)
    进行排序。显然,您需要一个特殊的类,将currency封装为enum(或string),将correlation value封装为double。然后按此值排序。在这里,他希望按值而不是键进行排序。将信息编码到字符串中带来的不便往往会累积。第二个选项将产生一个更简单、更易于维护的程序。有了封闭类,OP将能够仅通过
    list.sort((e1,e2)->e1.cor.compareTo(e2.cor))
    @SashaSalauyou进行排序。谢谢您的评论。我已经更新了我的答案,包括你的建议。谢谢你的回答,我必须尝试并实施这一点。我想问一下,为什么投反对票,这个问题太广泛了吗?@Antonheimo:一个好的问题通常包括问题是什么,你得到了什么,你期待什么。在你的例子中,你陈述了你拥有的和你想要得到的,但是没有表现出任何努力试图为自己解决问题。今后,请记住这一点。(请不要放弃你的全部代码,一个小例子说明问题所在,通常就足够了。@Albert Java 8是在一年多前发布的。我相信它现在应该被视为默认代码。
    /** 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