Сортировка списка объектов на основе разных членов данных в java


У меня есть этот класс:

public class Friend {

private String name;
private String location;
private String temp;
private String humidity;

public String getTemp() {
    return temp;
}

public void setTemp(String temp) {
    this.temp = temp;
}

public String getHumidity() {
    return humidity;
}

public void setHumidity(String humidity) {
    this.humidity = humidity;
}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}


public String getLocation() {
    return location;
}

public void setLocation(String location) {
    this.location = location;
}
}

Я хочу отсортировать список по имени, местоположению, температуре и влажности на основе ввода пользователя.
EDIT: пользователь указывает, по какому члену данных должна быть выполнена сортировка.
Как проще всего это сделать?
Спасибо.


person Brahadeesh    schedule 10.05.2012    source источник
comment
stackoverflow.com/questions/5178092 /   -  person jmj    schedule 10.05.2012


Ответы (3)


В Java есть статическая функция с именем Collections.sort(List, Comparator), который сортирует (генерированный) список объектов с учетом пользовательского компаратора, который, учитывая два объекта одного и того же типа, определяет, какой из них упорядочивается перед другим.

Ваша задача — написать функцию, которая создает компаратор, который упорядочивает объекты на основе своих аргументов и заданного пользователем порядка сортировки. Например:

public Comparator<Friend> getComparator(final String sortBy) {
  if ("name".equals(sortBy)) {
    return new Comparator<Friend>() {
      @Override int compare(Friend f1, Friend f2) 
        return f1.getName().compareTo(f2.getName());
      }
    };
  } else if ("location".equals(sortBy)) {
    return new Comparator<Friend>() {
      @Override int compare(Friend f1, Friend f2) 
        return f1.getLocation().compareTo(f2.getLocation());
      }
    };
  } else if ("temp".equals(sortBy)) {
    // ...
  } else {
    throw new IllegalArgumentException("invalid sort field '" + sortBy + "'");
  }
}
person maerics    schedule 10.05.2012

Поскольку вы хотите отсортировать их по четырем различным стандартам, реализация Comparable не имеет смысла. В этом случае вы можете обнаружить, что создаете разные компараторы для каждого параметра сортировки. Однако вы можете реализовать Comparable для наиболее логичного поля сортировки, такого как имя. В противном случае компараторы - это путь.

public class FriendNameComparator extends Comparator<Friend> {

    // assuming both are non-null for code simplicity; you may wish to change that
    public int compare(Friend f1, Friend f2) {
        return f1.getName().compareTo(f2.getName());
    }
}

public class FriendLocationComparator extends Comparator<Friend> {

    // assuming both are non-null for code simplicity; you may wish to change that
    public int compare(Friend f1, Friend f2) {
        return f1.getLocation().compareTo(f2.getLocation());
    }
}

// and so forth

Затем вы можете использовать функцию сортировки служебного класса Collections для сортировки по заданному компаратору.

Collections.sort(friendsList, new FriendNameComparator()); // sorts by name
Collections.sort(friendsList, new FriendLocationComparator()); // sorts by location
// etc
person FThompson    schedule 10.05.2012

List list=new ArrayList();

Используйте If else if для каждого критерия:

if(location ){
        Collections.sort(list, new Comparator () {
             public int compare(YourObject o1, YourObject o2) {
                    return o1.getLocation().compareTo(o2.getLocation());
                }

        });

    }

    } else if(temp ){

    ........
    }
    .......
person Shehzad    schedule 10.05.2012