我有一个计算货币和股票价值之间相关值的程序。我正在添加"对" (货币名称+":" +相关值)到ArrayList中,如果我打印出arraylist,这是我的输出:
SDG: 0.6672481089755959
RON: 0.7950474904606127
MKD: 0.788195252851783
MXN: 0.8429550156320716
CAD: 0.7777753208834005
ZAR: 0.8254509631193871
我试图通过一种聪明的方式来按相关值对它们进行排序,从最大到最小,但不能想到这样做的好方法。有什么想法吗?
答案 0 :(得分:4)
你可以有三种方法:
将Collections.sort
与自定义比较器一起使用,该比较器将字符串分割为:
(并修剪它),然后返回字符串数字部分的.compareTo
值。
创建一个新对象,可以称之为CurrencyCorrelation
,它有2个属性(currencyName
和correlation
可能?)。该类将实现Comparable
接口并覆盖toString()
方法以产生您想要的相关性(currencyName + ": " + String.valueOf(correlation)
)。然后,根据选项1,您无需指定比较器即可调用Collections.sort(...)
。
根据@Sasha Salauyou的建议,您也可以根据选项2声明该类,然后使用Java 8 lamba表达式来定义comaparator,而无需让您的类扩展Comparable
接口。这看起来像这样:list.sort((e1, e2) -> e1.getCorrelation().compareTo(e2.getCorrelation()))
第二个选项可能会更好,第一个选项需要更少的更改。
答案 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