使用数值 java 对字符串数组进行排序
Sorting an array of Strings with a numeric value, java
我有一个程序可以计算货币和股票价值之间的相关值。我将 "pairs"(货币名称 +“:”+ 相关值)添加到 ArrayList 中,如果我打印出数组列表,这是我的输出:
SDG: 0.6672481089755959
RON: 0.7950474904606127
MKD: 0.788195252851783
MXN: 0.8429550156320716
CAD: 0.7777753208834005
ZAR: 0.8254509631193871
我正在尝试想出一种聪明的方法来按相关值从大到小对它们进行排序,但想不出一个好的方法。有什么想法吗?
您可以将它们存储在已经排序的 TreeMap 中。来自文档:
映射根据其键的自然顺序进行排序,或者根据使用的构造函数在映射创建时提供的比较器进行排序。
您可以采用三种方法:
将 Collections.sort
与自定义比较器一起使用,它将字符串拆分为 :
(并修剪)然后 returns .compareTo
值字符串的数字部分。
创建一个新对象,可以称之为 CurrencyCorrelation
,它有 2 个属性(currencyName
和 correlation
也许吧?)。 class 将实现 Comparable
接口并覆盖 toString()
方法以产生您想要的相关性 (currencyName + ": " + String.valueOf(correlation)
)。然后,您可以根据选项 1 调用 Collections.sort(...)
而无需指定比较器。
根据@Sasha Salauyou 的建议,您还可以根据选项 2 声明 class,然后使用 Java 8 个兰巴表达式来定义比较器,而无需需要 class 扩展 Comparable
接口。这看起来像这样: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);
}
});
/** 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
我有一个程序可以计算货币和股票价值之间的相关值。我将 "pairs"(货币名称 +“:”+ 相关值)添加到 ArrayList 中,如果我打印出数组列表,这是我的输出:
SDG: 0.6672481089755959
RON: 0.7950474904606127
MKD: 0.788195252851783
MXN: 0.8429550156320716
CAD: 0.7777753208834005
ZAR: 0.8254509631193871
我正在尝试想出一种聪明的方法来按相关值从大到小对它们进行排序,但想不出一个好的方法。有什么想法吗?
您可以将它们存储在已经排序的 TreeMap 中。来自文档:
映射根据其键的自然顺序进行排序,或者根据使用的构造函数在映射创建时提供的比较器进行排序。
您可以采用三种方法:
将
Collections.sort
与自定义比较器一起使用,它将字符串拆分为:
(并修剪)然后 returns.compareTo
值字符串的数字部分。创建一个新对象,可以称之为
CurrencyCorrelation
,它有 2 个属性(currencyName
和correlation
也许吧?)。 class 将实现Comparable
接口并覆盖toString()
方法以产生您想要的相关性 (currencyName + ": " + String.valueOf(correlation)
)。然后,您可以根据选项 1 调用Collections.sort(...)
而无需指定比较器。根据@Sasha Salauyou 的建议,您还可以根据选项 2 声明 class,然后使用 Java 8 个兰巴表达式来定义比较器,而无需需要 class 扩展
Comparable
接口。这看起来像这样: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);
}
});
/** 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