Сортировать вектор пользовательских объектов - PullRequest
3 голосов
/ 25 февраля 2011

Как я могу отсортировать вектор своего пользовательского объекта и выбрать, по какому свойству сортировать?

Я видел этот вопрос и ответ, но я не слишком уверен, на чем основана его сортировка.Пример кода предпочтительнее «методологии».

Сортировать вектор пользовательских объектов

public class ItemLocation {
    String icon;
    String title;
    String message;
    String subtext;
    String deviceId;
    double latCoords;
    double lngCoords;
    int expiary;
    int id;
    double proximity;
    String locSeen;
}

Ответы [ 4 ]

15 голосов
/ 25 февраля 2011

Ниже приведен пример, который позволит вам сортировать по указанному полю ItemLocation:

public void sort(final String field, List<ItemLocation> itemLocationList) {
    Collections.sort(itemLocationList, new Comparator<ItemLocation>() {
        @Override
        public int compare(ItemLocation o1, ItemLocation o2) {
            if(field.equals("icon")) {
                return o1.icon.compareTo(o2.icon);
            } if(field.equals("title")) {
                return o1.title.compareTo(o2.title);
            } else if(field.equals("message")) {
                return o1.message.compareTo(o2.message);
            } 
            .
            . fill in the rest of the fields...
            .
            else if(field.equals("locSeen")) {
                return o1.locSeen.compareTo(o2.locSeen);
            } 
        }           
    });
}
5 голосов
/ 25 февраля 2011

Это работает:

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

/**
 * ComparableDemo
 * @author Michael
 * @since 2/24/11
 */
public class ComparableDemo
{
    public static void main(String[] args)
    {
        List<ItemLocation> itemLocations = new ArrayList<ItemLocation>();
        for (String arg : args)
        {
            itemLocations.add(new ItemLocation(arg));
        }

        System.out.println("before sort: " + itemLocations);
        Comparator<ItemLocation> comparator = new ItemLocationComparator();
        Collections.sort(itemLocations, comparator);
        System.out.println("after  sort: " + itemLocations);
    }
}

class ItemLocation
{
    String icon;
    String title;
    String message;
    String subtext;
    String deviceId;
    double latCoords;
    double lngCoords;
    int expiary;
    int id;
    double proximity;
    String locSeen;

    ItemLocation(String message)
    {
        this("", "", message, "", "", 0.0, 0.0, 0, 0, 0.0, "");
    }

    ItemLocation(String icon, String title, String message, String subtext, String deviceId, double latCoords, double lngCoords, int expiary, int id, double proximity, String locSeen)
    {
        this.icon = icon;
        this.title = title;
        this.message = message;
        this.subtext = subtext;
        this.deviceId = deviceId;
        this.latCoords = latCoords;
        this.lngCoords = lngCoords;
        this.expiary = expiary;
        this.id = id;
        this.proximity = proximity;
        this.locSeen = locSeen;
    }

    @Override
    public String toString()
    {
        final StringBuilder sb = new StringBuilder();
        sb.append("ItemLocation");
        sb.append("{message='").append(message).append('\'');
        sb.append('}');
        return sb.toString();
    }
}



class ItemLocationComparator implements Comparator<ItemLocation>
{
    public int compare(ItemLocation o1, ItemLocation o2)
    {
        return o1.message.compareTo(o2.message);
    }
}

Вот вывод:

C:\JDKs\jdk1.6.0_21\bin\java -Didea.launcher.port=7534 "-Didea.launcher.bin.path=C:\Program Files\JetBrains\IntelliJ IDEA 10.0.2\bin" -Dfile.encoding=windows-1252 com.intellij.rt.execution.application.AppMain ComparableDemo zeb meme apple
before sort: [ItemLocation{message='zeb'}, ItemLocation{message='meme'}, ItemLocation{message='apple'}]
after  sort: [ItemLocation{message='apple'}, ItemLocation{message='meme'}, ItemLocation{message='zeb'}]

Process finished with exit code 0
5 голосов
/ 25 февраля 2011

См. JavaDocs для java.util.Comparable и java.util.Comparator.

Класс, который реализует Comparable, можно сравнить с другими экземплярами этого класса.Это полезно для реализации естественного порядка поиска.Чтобы разрешить упорядочение, отличное от естественного порядка класса, вам нужно реализовать Comparator.Comparator - это отдельный объект, который способен сравнивать два других объекта с использованием любых критериев, которые он хочет.

В вашем случае вы, вероятно, захотите реализовать Comparator для каждого из различных свойств, которые выхотите упорядочить по или по одному, который можно настроить.

Comparable и Comparator оба используют одну и ту же идею для определения порядка: метод возвращает менее 0, 0 или более 0 для информированиявызывающий абонент, какой из 2 объектов упорядочен первым.В случае Comparable первый объект - this.

3 голосов
/ 25 февраля 2011

Допустим, у нас есть класс с int и строкой. Я могу определить, как один объект этого класса можно сравнить с другим.

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

 // this class *knows* how  to  "compare" against him self
class CustomObject implements Comparable<CustomObject> { 
    String aString;
    int aInt;
     ...
    public int compareTo(CustomObject two ) {
        int diff = this.aInt - two.aInt;//<-- compare ints
        if( diff != 0 ) { // they have different int
            return diff;
        }    
        return this.aString.compareTo( two.aString );//<-- compare strings... 
   }
   ...
}

Вот полная демонстрационная версия ...

import java.util.*;
class SortDemo { 
    public static void main( String ... args ) { 
        // create a bunch and sort them 
        List<CustomObject> list = Arrays.asList(
            new CustomObject(3, "Blah"),
            new CustomObject(30, "Bar"),
            new CustomObject(1, "Zzz"),
            new CustomObject(1, "Aaa")
        );
        System.out.println( "before: "+ list );
        Collections.sort( list );
        System.out.println( "after : "+ list );
    }
}
 // this class *knows* how  to  "compare" against him self
class CustomObject implements Comparable<CustomObject> { 
    String aString;
    int aInt;
    CustomObject( int i, String s ) { 
        aInt = i;
        aString = s;
    }
    // comparable interface lets you
    // specify "HOW" to compare two 
    // custom objects
    public int compareTo(CustomObject two ) {
        // I migth compare them using the int first 
        // and if they're the same, use the string... 
        int diff = this.aInt - two.aInt;
        if( diff != 0 ) { // they have different int
            return diff;
        }

        // else let the strings compare them selves
        return this.aString.compareTo( two.aString );
   }
   public String toString(){
       return "CustomObject[aInt="+aInt+", aString="+aString+"]";
   }
}

Вот вывод:

before: [CustomObject[aInt=3, aString=Blah], CustomObject[aInt=30, aString=Bar], CustomObject[aInt=1, aString=Zzz], CustomObject[aInt=1, aString=Aaa]]
after : [CustomObject[aInt=1, aString=Aaa], CustomObject[aInt=1, aString=Zzz], CustomObject[aInt=3, aString=Blah], CustomObject[aInt=30, aString=Bar]]

Надеюсь, это достаточно ясно

Вы также можете передать пользовательский компаратор. Дайте мне знать, если вам нужен образец этого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...