使用数值对字符串数组进行排序,java
我有一个程序,可以计算货币和股票价值之间的关联值。我正在将“对”(货币名称+:“+相关值)添加到ArrayList中,如果我打印出ArrayList,这就是我的输出:使用数值对字符串数组进行排序,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 我正试图想出一种聪明的方法,通过相关性值对它
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所示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