2015-04-27 3 views
-2

У меня есть программа, которая вычисляет значение корреляции между валютой и стоимостью запаса. Я добавляю в «пар» (валюты название + «:» + значение корреляции) в к ArrayList и если я распечатать ArrayList это мой выход:Сортировка массива строк с числовым значением, java

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

Я пытаюсь думать о умный способ отсортировать их по значению корреляции, от самого большого до самого маленького, но не может придумать хороший способ сделать это. Есть идеи?

+1

'' Double' реализует интерфейс Comparable'. Таким образом, вы можете сортировать с помощью 'Collections.sort (List )' – Albert

+1

Вам, очевидно, нужен специальный класс, включающий валюту, как enum (или string) и значение корреляции как double. Затем сортируйте по этому значению. –

ответ

4

Вы мог бы иметь три подхода:

  1. Использование Collections.sort с помощью пользовательского компаратора, который расщепляет строку на : (и урежет его), а затем возвращает значение числовой части вашей строки .compareTo.

  2. Создать новый объект, возможно, назвать его CurrencyCorrelation который имеет 2 объекта (currencyName и correlation, может быть?). Класс реализует интерфейс Comparable и переопределяет метод toString(), чтобы получить корреляцию по вашему желанию (currencyName + ": " + String.valueOf(correlation)). Затем вы должны позвонить Collections.sort(...) без необходимости указания компаратора в соответствии с опцией 1.

  3. Согласно рекомендации @Sasha Salauyou, вы также можете объявить класс в соответствии с опцией 2, а затем использовать выражения Java 8 lamba для определения comaparator, не требуя, чтобы ваш класс расширил интерфейс Comparable. Это будет выглядеть примерно так: list.sort((e1, e2) -> e1.getCorrelation().compareTo(e2.getCorrelation()))

Второй вариант, вероятно, будет лучше, с первым вариантом, требующим меньше изменений.

+1

Неудобства, связанные с кодированием информации в Строке, будут накапливаться. Второй вариант приведет к более простой и удобной программе. –

+0

Прилагая класс, OP сможет сортировать только по 'list.sort ((e1, e2) -> e1.cor.compareTo (e2.cor))' –

+0

@SashaSalauyou: Спасибо за ваш комментарий. Я обновил свой ответ, чтобы включить вашу рекомендацию. – npinti

0

Вы можете хранить их в TreeMap, которые уже отсортированы. From Docs:

Карта сортируется в соответствии с естественным порядком ее ключей или компаратором, предусмотренным при создании карты, в зависимости от того, какой конструктор используется.

+0

здесь он хочет сортировать одну из базисных ценностей, а не ключ. – Prashant

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

}); 
+0

Это будет работать, но это нарушает принципы ООП ... –

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     
+0

Я думаю, вы должны указать, что это эксклюзивный Java8. – Albert

+0

@ Albert Java 8 был выпущен более года назад. Я считаю, что в настоящее время его следует рассматривать как дефолт. –

Смежные вопросы