2015-05-01 6 views
4

У меня есть arraylist рекордов для карточной игры, которую я делаю. Должен быть конечный предел количества баллов, которые может хранить этот arraylist, который пользователь системы может определить (скажем, 10 на данный момент). Поля в объектах в arraylist - это имя игрока (строка), их оценка (int) и (почти) уникальный идентификатор для игрока (Long, System.currentTimeMillis()). Арраист должен быть отсортирован по партитуре, где самый низкий результат - лучший. Однако, если все игроки в арраисте имеют одинаковый балл, и новый игрок добавляется с этим счетом, я хотел бы, чтобы игроки с самыми последними результатами (те, для которых самый высокий ID) были сохранены перед более старыми, поэтому старые отброшены.Сортировка Arraylist двумя полями (Java)

По существу, мне нужен способ сортировки массива ArrayList по двум полям: оценка сначала, от низкого до высокого, а затем, если оценки соответствуют сортировке по идентификатору. Удаление лишних элементов, которые я уже в основном покрывал, хотя, если есть способ интегрировать, мне было бы интересно его услышать.

EDIT: Я пытаюсь сортировать Arraylist объектов с этими атрибутами, а не только один аррайалист с ними просто вбрасывается.

+1

Отправьте код, который вы написали, пожалуйста, пожалуйста. – ChristofferPass

+0

А где вы застряли? – mattias

+1

Можете ли вы просто создать класс для хранения данных, который реализует сопоставимые https://docs.oracle.com/javase/7/docs/api/java/lang/Comparable.html, а затем запустить стандартную функцию Collections.sort? – aplassard

ответ

3

Не используйте ArrayList для хранения данных.

Создайте собственный объект с идентификаторами, именами, оценками .... Затем вы создаете таможню Comparator,

Ниже приведен пример простого пользовательского объекта и пользовательского Компаратора. Вы должны изменить Компаратор для реализации описанной вами логики.

/* 
** Use the Collections API to sort a List for you. 
** 
** When your class has a "natural" sort order you can implement 
** the Comparable interface. 
** 
** You can use an alternate sort order when you implement 
** a Comparator for your class. 
*/ 
import java.util.*; 

public class Person implements Comparable<Person> 
{ 
    String name; 
    int age; 

    public Person(String name, int age) 
    { 
     this.name = name; 
     this.age = age; 
    } 

    public String getName() 
    { 
     return name; 
    } 

    public int getAge() 
    { 
     return age; 
    } 

    public String toString() 
    { 
     return name + " : " + age; 
    } 

    /* 
    ** Implement the natural order for this class 
    */ 
    public int compareTo(Person p) 
    { 
     return getName().compareTo(p.getName()); 
    } 

    static class AgeComparator implements Comparator<Person> 
    { 
     public int compare(Person p1, Person p2) 
     { 
      return p1.getAge() - p2.getAge(); 
     } 
    } 

    public static void main(String[] args) 
    { 
     List<Person> people = new ArrayList<Person>(); 
     people.add(new Person("Homer", 38)); 
     people.add(new Person("Marge", 35)); 
     people.add(new Person("Bart", 15)); 
     people.add(new Person("Lisa", 13)); 

     // Sort by natural order 

     Collections.sort(people); 
     System.out.println("Sort by Natural order"); 
     System.out.println("\t" + people); 

     // Sort by reverse natural order 

     Collections.sort(people, Collections.reverseOrder()); 
     System.out.println("Sort by reverse natural order"); 
     System.out.println("\t" + people); 

     // Use a Comparator to sort by age 

     Collections.sort(people, new Person.AgeComparator()); 
     System.out.println("Sort using Age Comparator"); 
     System.out.println("\t" + people); 

     // Use a Comparator to sort by descending age 

     Collections.sort(people, Collections.reverseOrder(new Person.AgeComparator())); 
     System.out.println("Sort using Reverse Age Comparator"); 
     System.out.println("\t" + people); 
    } 
} 
+1

Что случилось с ArrayList в этом случае? Вы можете сортировать ArrayList с помощью Comparator просто отлично. – eckes

+1

@eckes, это ArrayList содержит те же данные, что и в норме, но вы не должны использовать ArrayList для хранения различных полей, описываемых OP. Вы создаете пользовательский объект, чтобы вы могли иметь getters/setter для каждого поля. – camickr

+0

Ах, моя ошибка. Это Arraylist пользовательского объекта, который я пытаюсь сортировать. Я отредактирую вопрос. – 4oursword

2

Вы можете использовать Collections.sort()

Class Student{ 

    String fname=""; 
    String lname=""; 
    int age =0; 
    int score=0; 

    public Student(String fname,String lname,int age, int score) 
    { 
     this.fname=fname; 
     this.lname=lname; 
     this.age=age; 
     this.score=score; 
    } 

    } 

Сортировка мой список

ArrayList<Student> list = new ArrayList<Student>(); 
    /*add elements*/ 
    Collections.sort(list, new Comparator<Student>() 
    { 
     @Override 
     public int compare(Student x, Student y) 
     { 
      if(x.score == y.score) 
      { 
       return (y.age-x.age); 
      } 
      else 
       return (y.score-x.score); 

     } 
    }); 
5

Если вы используете Java 8, есть отличный способ гнездования компараторов со ссылками методом :

List<Player> players = // ... 

players.sort(Comparator 
    .comparing(Player::getScore) 
    .thenComparing(Player::getId)); 

Более подробную информацию можно найти в ComparatorJavaDoc.

+2

Java внезапно настолько сексуальна, вам это не нравится? :) – eckes

+0

@matsev Я получаю ошибки: метод сравнения (Function ) в типе Comparator не применим для аргументов (PlayerScore :: getpilesRemaining), тип PlayerScore не определяет getpilesRemaining (Object), который применим здесь. Тип PlayerScore не определяет getUniqueID (Object, Object), который является применимо здесь. Не уверен, что с ним происходит – 4oursword

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