Список сортировки по значению индекса

Это то, что я до сих пор, я пытаюсь разобрать кучу 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 интерфейс.

Другие вопросы по тегам