Список сортировки по значению индекса
Это то, что я до сих пор, я пытаюсь разобрать кучу List<String>
на основе значения индекса.
LinkedHashSet<List<String>> sorted = new LinkedHashSet<List<String>>();
Как отсортировать LinkedHashSet по порядку от максимального к низшему значению индекса 2 списка?
Пример ввода:
List<String> data1 = Database.getData(uuid);
double price = Double.valueOf(data1.get(2))
data1.add("testval");
data1.add("testval");
data1.add("100.00");
sorted.add(data1);
и в другом отдельном списке:
List<String> data2 = Database.getData(uuid);
double price = Double.valueOf(data2.get(2))
data2.add("anotherval");
data2.add("anotherval");
data2.add("50.00");
sorted.add(data2);
Вывод отсортированного LinkedHashSet в порядке убывания.
testval testval 100.00
anotherval anotherval 50.00
Извините, если это сбивает с толку, я не уверен, куда идти сортировать, как это.
3 ответа
Создайте новый класс для представления вам сложных объектов. Нет необходимости хранить несколько значений в списке, когда вы можете сделать это в объектах.
public class ComplexObject {
private String description1;
private String description2;
private Double value;
public ComplexObject(String description1, String description2, Double value) {
this.description1 = description1;
this.description2 = description2;
this.value = value;
}
public void setDescription1(String description1) {
this.description1 = description1;
}
public String getDescription1() {
return description1;
}
public void setDescription2(String description2) {
this.description2 = description2;
}
public String getDescription2() {
return description2;
}
public void setValue(Double value) {
this.value = value;
}
public Double getValue() {
return value;
}
}
Затем добавьте элементы в список и отсортируйте его с помощью нового пользовательского компаратора:
public static void main(String[] args) {
List<ComplexObject> complexObjectList = new ArrayList<ComplexObject>();
//add elements to the list
complexObjectList.add(new ComplexObject("testval","testval",100.00d));
complexObjectList.add(new ComplexObject("anotherval","anotherval",50.00d));
//sort the list in descending order based on the value attribute of complexObject
Collections.sort(complexObjectList, new Comparator<ComplexObject>() {
public int compare(ComplexObject obj1, ComplexObject obj2) {
return obj2.getValue().compareTo(obj1.getValue()); //compares 2 Double values, -1 if less , 0 if equal, 1 if greater
}
});
//print objects from sorted list
for(ComplexObject co : complexObjectList){
System.out.println(co.getDescription1()+" "+co.getDescription2()+" "+co.getValue());
}
}
Выход:
testval testval 100.0 Anotherval Anotherval 50,0
- Во-первых, вы не должны использовать
LinkedHashSet
ноTreeSet
,LinkedHashSet
сохранит порядок вставки без сортировки. - Во-вторых, вам нужно инициализировать ваш
TreeSet
сComparator
который сравнивает в зависимости от того, какую ценность вашегоList
требуется, то есть если вы знаете индексString
это будет представлятьdouble
ценность заранее. В противном случае я бы рекомендовал использовать пользовательские объекты вместоList
,
Если вы решили использовать пользовательские объекты, вам не обязательно инициализировать TreeSet
с Comparator
в качестве второго аргумента.
Вместо этого вы могли бы реализовать свои пользовательские объекты Comparable
и реализовать единовременную логику сравнения там.
Все зависит от того, нужно ли вам сортировать только в определенном порядке.
Наконец, пользовательские объекты потребуют переопределения equals
а также hashCode
,
Сначала, и извлечено из ссылки Oracle на Java:
Этот связанный список определяет порядок итераций, то есть порядок, в котором элементы были вставлены в набор
Таким образом, вы не можете отсортировать данные, просто вставив их в LinkedHashSet
, Возможно, вы путаете реализацию этого набора с SortedSet. SortedSet
позволяет передавать компаратор, который будет определять порядок элементов в структуре данных.
С другой стороны, я не знаю, выбрал ли ты тебя List<String>
произвольно, но мне кажется более разумным вариантом объединить ваши 3 строки в качестве атрибутов класса. Дело в том, что, если ваши элементы всегда будут 3 элементами, последний из них будет двойным значением: зачем вам динамическая структура как List
?
РЕДАКТИРОВАТЬ
Здесь у вас есть возможная лучшая реализация того, что вы хотите:
public class Element
{
public Element(String a, String b, double val) {
this.a = a;
this.b = b;
this.val = val;
}
@Override
public String toString() {
return a + "\t" + b + "\t" + val;
}
public String a;
public String b;
public double val;
}
И вы можете использовать этот класс для хранения ваших элементов. Пример использования:
SortedSet<Element> sorted = new TreeSet<>(new Comparator<Element>() {
@Override
public int compare(Element o1, Element o2) {
return (new Double(o1.val)).compareTo(o2.val);
}
});
sorted.add(new Element("testval", "testval", 100.0));
sorted.add(new Element("anotherval", "anotherval", 50.0));
for(Element el: sorted)
{
System.out.println(el);
}
Обратите внимание, что компаратор дан как экземпляр анонимного внутреннего класса, реализующего Java Comparator
интерфейс.