Pasirinktinių objektų „ArrayList“ rūšiavimas pagal nuosavybę

Aš perskaičiau apie „ArrayLists“ rūšiavimą naudojant „Comparator“, bet visuose pavyzdžiuose žmonės naudojo palyginimą, kuris, remiantis kai kuriais tyrimais, yra styginių metodas.

Norėjau rūšiuoti „ArrayList“ naudotojo objektams su viena iš mano savybių: datos objektas ( getStartDay() ). Paprastai juos item1.getStartDate().before(item2.getStartDate()) su item1.getStartDate().before(item2.getStartDate()) , todėl man įdomu, ar galėčiau parašyti kažką panašaus:

 public class CustomComparator { public boolean compare(Object object1, Object object2) { return object1.getStartDate().before(object2.getStartDate()); } } public class RandomName { ... Collections.sort(Database.arrayList, new CustomComparator); ... } 
877
07 мая '10 в 0:09 2010-05-07 00:09 Samuel yra nustatytas gegužės 07-ą 10, 00:09 2010-05-07 00:09
@ 23 atsakymai

Kadangi „ Date implementations Comparable Date Comparable metodas, kaip ir String .

Taigi, pasirinktinis Comparator gali atrodyti taip:

 public class CustomComparator implements Comparator<MyObject> { @Override public int compare(MyObject o1, MyObject o2) { return o1.getStartDate().compareTo(o2.getStartDate()); } } 

Metodas compare() turi grąžinti int , taigi jūs negalite tiesiogiai grąžinti boolean kaip jūs planavote.

Jūsų rūšiavimo kodas atrodys panašiai kaip rašėte:

 Collections.sort(Database.arrayList, new CustomComparator()); 

Šiek tiek trumpesnis būdas rašyti visa tai, jei nereikia pakartotinai naudoti komparatorių, tai parašyti kaip integruotą anoniminę klasę:

 Collections.sort(Database.arrayList, new Comparator<MyObject>() { @Override public int compare(MyObject o1, MyObject o2) { return o1.getStartDate().compareTo(o2.getStartDate()); } }); 

Nuo

Paskutinį pavyzdį galite parašyti trumpesnėje formoje, naudodami lambda išraišką Comparator :

 Collections.sort(Database.arrayList, (o1, o2) -> o1.getStartDate().compareTo(o2.getStartDate())); 

Ir List yra sort(Comparator) metodas, todėl galite jį dar sutrumpinti:

 Database.arrayList.sort((o1, o2) -> o1.getStartDate().compareTo(o2.getStartDate())); 

Tai tokia paplitusi idioma, kad integruotas metodas, skirtas sukurti klasę Comparator su klavišu Comparable

 Database.arrayList.sort(Comparator.comparing(MyObject::getStartDate)); 

Visa tai yra lygiavertės formos.

1190
07 мая '10 в 0:18 2010-05-07 00:18 atsakė Michael Myersui gegužės 07 d. 10 val. 0:18 2010-05-07 00:18

Klasės, turinčios natūralią rūšiavimo tvarką (pvz., Klasės numerį), turi įgyvendinti palyginamąją sąsają, o klasės, neturinčios natūralios rūšiavimo tvarkos (pvz., Klasė), turi būti aprūpintos lyginamuoju (arba anoniminės lyginamosios klasės).

Du pavyzdžiai:

 public class Number implements Comparable<Number> { private int value; public Number(int value) { this.value = value; } public int compareTo(Number anotherInstance) { return this.value - anotherInstance.value; } } public class Chair { private int weight; private int height; public Chair(int weight, int height) { this.weight = weight; this.height = height; }  } class ChairWeightComparator implements Comparator<Chair> { public int compare(Chair chair1, Chair chair2) { return chair1.getWeight() - chair2.getWeight(); } } class ChairHeightComparator implements Comparator<Chair> { public int compare(Chair chair1, Chair chair2) { return chair1.getHeight() - chair2.getHeight(); } } 
border=0

Naudoti:

 List<Number> numbers = new ArrayList<Number>(); ... Collections.sort(numbers); List<Chair> chairs = new ArrayList<Chair>(); // Sort by weight: Collections.sort(chairs, new ChairWeightComparator()); // Sort by height: Collections.sort(chairs, new ChairHeightComparator()); // You can also create anonymous comparators; // Sort by color: Collections.sort(chairs, new Comparator<Chair>() { public int compare(Chair chair1, Chair chair2) { ... } }); 
172
07 мая '10 в 0:45 2010-05-07 00:45 atsakė Björnui gegužės 07 d. 10 val. 0:45 2010-05-07 00:45

Jei norite rūšiuoti „ ArrayList galite naudoti šį kodo fragmentą:

 Collections.sort(studList, new Comparator<Student>(){ public int compare(Student s1, Student s2) { return s1.getFirstName().compareToIgnoreCase(s2.getFirstName()); } }); 
142
06 мая '12 в 16:50 2012-05-06 16:50 atsakymą pateikė vartotojo1377710 gegužės 06 d. 12 val. 16:50 2012-05-06 16:50

Taip, galite. Yra du elementų palyginimo variantai: palyginamasis ir palyginamasis .

Abi šios sąsajos leidžia skirtingai elgtis. Palyginamas leidžia jums padaryti objektą, kaip jūs ką tik aprašėte Stygos (iš tiesų, styginių padargai palyginami). Antrasis, Comparator, leidžia jums daryti tai, ko prašote. Tai padarytumėte taip:

 Collections.sort(myArrayList, new MyComparator()); 

Dėl to kolekcijos.sort metodas naudoja jūsų palyginamąjį įrenginį rūšiavimo mechanizmui. Jei ArrayList masyvo objektai yra panašūs, galite tai padaryti:

 Collections.sort(myArrayList); 

Kolekcijų klasėje yra keletas šių naudingų bendrų įrankių.

37
07 мая '10 в 0:17 2010-05-07 00:17 atsakymą pateikė „ aperkins “ gegužės 07 d. 10 val. 0:17 2010-05-07 00:17

JAVA 8 lambda išraiška

 Collections.sort(studList, (Student s1, Student s2) ->{ return s1.getFirstName().compareToIgnoreCase(s2.getFirstName()); }); 

Or

 Comparator<Student> c = (s1, s2) -> s1.firstName.compareTo(s2.firstName); studList.sort(c) 
30
05 сент. Atsakyti Rūšiuoti 05 Sep. 2014-09-05 16:10 '14 at 16:10 2014-09-05 16:10

Naudodami „Java 8“, galite naudoti palyginamojo metodo nuorodą:

 import static java.util.Comparator.comparing; Collections.sort(list, comparing(MyObject::getStartDate)); 
25
13 марта '14 в 18:19 2014-03-13 18:19 Asylias atsakymas, pateiktas kovo 14 d. 14, 18:19 2014-03-13 18:19
 import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.Date; public class test { public static class Person { public String name; public int id; public Date hireDate; public Person(String iname, int iid, Date ihireDate) { name = iname; id = iid; hireDate = ihireDate; } public String toString() { return name + " " + id + " " + hireDate.toString(); } // Comparator public static class CompId implements Comparator<Person> { @Override public int compare(Person arg0, Person arg1) { return arg0.id - arg1.id; } } public static class CompDate implements Comparator<Person> { private int mod = 1; public CompDate(boolean desc) { if (desc) mod =-1; } @Override public int compare(Person arg0, Person arg1) { return mod*arg0.hireDate.compareTo(arg1.hireDate); } } } public static void main(String[] args) { // TODO Auto-generated method stub SimpleDateFormat df = new SimpleDateFormat("mm-dd-yyyy"); ArrayList<Person> people; people = new ArrayList<Person>(); try { people.add(new Person("Joe", 92422, df.parse("12-12-2010"))); people.add(new Person("Joef", 24122, df.parse("1-12-2010"))); people.add(new Person("Joee", 24922, df.parse("12-2-2010"))); } catch (ParseException e) { // TODO Auto-generated catch block e.printStackTrace(); } Collections.sort(people, new Person.CompId()); System.out.println("BY ID"); for (Person p : people) { System.out.println(p.toString()); } Collections.sort(people, new Person.CompDate(false)); System.out.println("BY Date asc"); for (Person p : people) { System.out.println(p.toString()); } Collections.sort(people, new Person.CompDate(true)); System.out.println("BY Date desc"); for (Person p : people) { System.out.println(p.toString()); } } } 
11
03 апр. CharlesW atsakymas, pateiktas balandžio 03 d 2012-04-03 18:32 '12 at 18:32 2012-04-03 18:32

Kiekvieną dieną atsiradus technologijai atsakymas laikui bėgant pasikeis. Pažvelgiau į LambdaJ ir atrodo labai įdomu.

Šias problemas galite išspręsti su LambdaJ . Ją galite rasti čia: http://code.google.com/p/lambdaj/

Čia jūs turite pavyzdį:

Rūšiuoti iteracijas

 List<Person> sortedByAgePersons = new ArrayList<Person>(persons); Collections.sort(sortedByAgePersons, new Comparator<Person>() { public int compare(Person p1, Person p2) { return Integer.valueOf(p1.getAge()).compareTo(p2.getAge()); } }); 

Rūšiavimas su lambda

 List<Person> sortedByAgePersons = sort(persons, on(Person.class).getAge()); 

Žinoma, tokio grožio buvimas veikia našumą (vidutiniškai 2 kartus), bet ar galite rasti daugiau skaitomo kodo?

9
12 марта '14 в 20:49 2014-03-12 20:49 atsakymą pateikė Federico Piazza kovo 14 d., 14 d., 20:49, 2014-03-12 20:49

Galite naudoti „ Bean Comparator“, jei norite rūšiuoti bet kokią jūsų pasirinktos klasės nuosavybę.

5
07 мая '10 в 0:29 2010-05-07 00:29 atsakymas pateikiamas camickr 07 gegužės 10 d. 0:29 2010-05-07 00:29

Nuo „ Java 8 nuo tada nereikia tiesiogiai naudoti „ Collections.sort() . List sąsaja turi numatytąjį sort() metodą:

 List<User> users = Arrays.asList(user1,user2,user3); users.sort( (u1, u2) -> { return u1.getFirstName.compareTo(u2.getFirstName());}); 

Žr. Http://visvv.blogspot.in/2016/01/sorting-objects-in-java-8.html .

5
03 янв. Atsakymą pateikė Vishnu Vasudevan 03 Jan. 2016-01-03 09:58 '16 at 9:58 2016-01-03 09:58

Paprasčiausias būdas su JAVA 8 - anglų kalbos abėcėlės tvarka

Klasės įvadas

 public class NewspaperClass implements Comparable<NewspaperClass>{ public String name; @Override public int compareTo(NewspaperClass another) { return name.compareTo(another.name); } } 

Rūšiuoti

  Collections.sort(Your List); 

Jei norite rūšiuoti abėcėlę, kurioje yra ne anglų kalbos simbolių, galite naudoti Locale ... Turkijos simbolių rūšiavimas naudojamas žemiau kodo ...

Klasės įvadas

 public class NewspaperClass implements Comparator<NewspaperClass> { public String name; public Boolean isUserNewspaper=false; private Collator trCollator = Collator.getInstance(new Locale("tr_TR")); @Override public int compare(NewspaperClass lhs, NewspaperClass rhs) { trCollator.setStrength(Collator.PRIMARY); return trCollator.compare(lhs.name,rhs.name); } } 

Rūšiuoti

 Collections.sort(your array list,new NewspaperClass()); 
5
28 мая '16 в 15:11 2016-05-28 15:11 atsakymas pateikiamas Beyaz gegužės 28, 16 d. 15:11 2016-05-28 15:11

Galite pabandyti „Guava“ užsakymą :

 Function<Item, Date> getStartDate = new Function<Item, Date>() { public Date apply(Item item) { return item.getStartDate(); } }; List<Item> orderedItems = Ordering.natural().onResultOf(getStartDate). sortedCopy(items); 
4
17 марта '13 в 2:06 2013-03-17 02:06 atsakymas pateikiamas Vitalii Fedorenko kovo 17 d., 13 val., 02:06 2013-03-17 02:06

Šie kodo fragmentai gali būti naudingi. Jei norite rūšiuoti objektą mano atveju, noriu surūšiuoti pagal „VolumeName“:

 public List<Volume> getSortedVolumes() throws SystemException { List<Volume> volumes = VolumeLocalServiceUtil.getAllVolumes(); Collections.sort(volumes, new Comparator<Volume>() { public int compare(Volume o1, Volume o2) { Volume p1 = (Volume) o1; Volume p2 = (Volume) o2; return p1.getVolumeName().compareToIgnoreCase( p2.getVolumeName()); } }); return volumes; } 

Jis veikia. Aš jį naudoju jsp.

3
04 февр. Atsakymą pateikė Laura Liparulo 04 vasaris. 2013-02-04 14:29 '13, 14:29 pm 2013-02-04 14:29

Galite rūšiuoti naudodami java 8

 yourList.sort(Comparator.comparing(Classname::getName)); or yourList.stream().forEach(a -> a.getBObjects().sort(Comparator.comparing(Classname::getValue))); 
3
06 сент. atsakymas, kurį pateikė Seeker 06 sept. 2016-09-06 07:26 '16 at 7:26 am 2016-09-06 07:26

Taip, tai, pavyzdžiui, šiame atsakyme galima IndexValue klasės IndexValue

  // Sorting by property v using a custom comparator. Arrays.sort( array, new Comparator<IndexValue>(){ public int compare( IndexValue a, IndexValue b ){ return av - bv; } }); 

Jei pastebėsite, kad sukuriu anoniminę vidinę klasę (kuri yra „Java“ uždarymui) ir perduodu ją tiesiogiai „ Arrays klasės sort metodui

Comparable taip pat gali būti įgyvendintas jūsų objekte (tai, kad String ir dauguma pagrindinių bibliotekų yra „Java“), tačiau tai lemia pačios klasės „natūralią rūšiavimo tvarką“ ir neleidžia prijungti naujų.

3
07 мая '10 в 0:29 2010-05-07 00:29 Atsakymas pateikiamas OscarRyz gegužės 07, 10 dienomis 0:29 2010-05-07 00:29

„Java 8 Lambda“ mažina rūšiavimą.

 Collections.sort(stdList, (o1, o2) -> o1.getName().compareTo(o2.getName())); 
3
09 сент. Atsakymą pateikia „ javasenior“ 09 rugsėjis 2015-09-09 17:18 '15, 17:18, 2015-09-09 17:18

Šioje bibliotekoje galite rūšiuoti pasirinktų objektų sąrašą į keletą stulpelių. Bibliotekoje naudojamos 8.0 versijos funkcijos. Taip pat yra pavyzdys. Čia yra pavyzdys.

 SortKeys sortKeys = new SortKeys(); sortKeys.addField("firstName") .addField("age", true); // This (true) will sort the age descending // Other ways to specify a property to the sorter are // .addField("lastName", String.class); // .addField("dob", Date.class, true); // Instantiate a ListSorter ListSorter listSorter = new ListSorter(); // Pass the data to sort (listToSort) and the "by keys" to sort (sortKeys) List sortedList = (List<Person>) listSorter.sortList(listToSort, sortKeys); 
2
26 сент. Atsakymą pateikė Shriram M. 26 sep . 2015-09-26 19:37 '15, 19:37, 2015-09-26 19:37

„Java 8“:

 Collections.sort(list, comparing(ClassName::getName)); 

arba

 Collections.sort(list, comparing(ClassName::getName).reversed()); 

Atrodo, kad darbas su eilutės datos tipu yra toks pat, kaip ir „2015-12-14T21: 55: 51Z“

Kitas būdas yra

 Collections.sort(list, comparing(ClassName::getName, Comparator.nullsLast(Comparator.naturalOrder()))); 
2
15 дек. atsakymą pateikė Arun 15 d. 2015-12-15 03:37 '15, 3:37 2015-12-15 03:37

Šį pristatymą galite perskaityti „Java“ forume Štutgarte 2016 m.

Tik kelios skaidrės naudoja vokiečių kalbą, 99% turinio yra „Java“ šaltinio kodas anglų kalba; kaip

 someCollection.sort( OurCustomComparator .comparing(Person::getName) .thenComparing(Person::getId) ); 

kur „ OurCustomComparator naudoja numatytus metodus (ir kitas įdomias idėjas). Kaip parodyta, gaunamas labai suspaustas kodas, kad būtų galima pasirinkti kai kuriuos getter metodus rūšiavimui; ir super paprastus susiejimo (arba atbulinės eigos) rūšiavimo kriterijus.

Jei esate java8, pradėsite daug medžiagos.

2
20 дек. atsakymą pateikė GhostCat 20 d. 2016-12-20 15:49 '16, 15:49 PM 2016-12-20 15:49

Daugiausia pastebėjau, jei ne visi šie atsakymai priklauso nuo bazinės klasės (objekto), kad galėtų įgyvendinti palyginamą ar papildomą panašią sąsają.

Ne su mano sprendimu! Šis kodas leidžia palyginti objekto lauką, žinodamas jo eilutės pavadinimą. Jį galite lengvai pakeisti, kad nenaudotumėte pavadinimo, bet tada turite jį atskleisti arba sukurti vieną iš objektų, su kuriais norite palyginti.

 Collections.sort(anArrayListOfSomeObjectPerhapsUsersOrSomething, new ReflectiveComparator(). new ListComparator("name")); public class ReflectiveComparator { public class FieldComparator implements Comparator<Object> { private String fieldName; public FieldComparator(String fieldName){ this.fieldName = fieldName; } @SuppressWarnings({ "unchecked", "rawtypes" }) @Override public int compare(Object object1, Object object2) { try { Field field = object1.getClass().getDeclaredField(fieldName); field.setAccessible(true); Comparable object1FieldValue = (Comparable) field.get(object1); Comparable object2FieldValue = (Comparable) field.get(object2); return object1FieldValue.compareTo(object2FieldValue); }catch (Exception e){} return 0; } } public class ListComparator implements Comparator<Object> { private String fieldName; public ListComparator(String fieldName) { this.fieldName = fieldName; } @SuppressWarnings({ "unchecked", "rawtypes" }) @Override public int compare(Object object1, Object object2) { try { Field field = object1.getClass().getDeclaredField(fieldName); field.setAccessible(true); Comparable o1FieldValue = (Comparable) field.get(object1); Comparable o2FieldValue = (Comparable) field.get(object2); if (o1FieldValue == null){ return -1;} if (o2FieldValue == null){ return 1;} return o1FieldValue.compareTo(o2FieldValue); } catch (NoSuchFieldException e) { throw new IllegalStateException("Field doesn't exist", e); } catch (IllegalAccessException e) { throw new IllegalStateException("Field inaccessible", e); } } } } 
2
25 апр. Kevino Parkerio atsakymas, pateiktas balandžio 25 d 2012-04-25 22:28 '12 10:28 val. 2012-04-25 22:28

jūsų „CustomComparator“ klasė turi įdiegti java.util.Comparator naudoti. ji taip pat turi nepaisyti palyginimo () IR lygių ()

palyginti () turėtų atsakyti į klausimą: Ar objektas 1 yra mažesnis, lygus arba didesnis už 2 objektą?

užpildykite dokumentus: http://java.sun.com/j2se/1.5.0/docs/api/java/util/Comparator.html

1
07 мая '10 в 0:20 2010-05-07 00:20 atsakė Vinny'ui gegužės 10 d. 10 val. 0:20 2010-05-07 00:20

Aš norėčiau šį procesą:

 public class SortUtil { public static <T> List<T> sort(List<T> list, String sortByProperty) { Collections.sort(list, new BeanComparator(sortByProperty)); return list; } } List<T> sortedList = SortUtil<T>.sort(unsortedList, "startDate"); 

Jei objektų sąraše yra startDate , tai dar kartą paskambinate. Jūs netgi galite susieti juos su startDate.time .

Tam reikia, kad jūsų objektas būtų Comparable , o tai reiškia, kad jums reikia compareTo , equals ir hashCode .

Taip, jis gali būti greitesnis ... Bet dabar nereikia sukurti naujo palyginimo kiekvienam rūšiavimo tipui. Jei galite išsaugoti „dev“ laiką ir atsisakyti vykdymo laiko, galite eiti su juo.

1
07 мая '10 в 2:43 2010-05-07 02:43 atsakymas duotas DDus gegužės 07, 10 dienomis 2:43 2010-05-07 02:43

Naujas, nes 1.8 yra „List.sort“ () metodas, o ne naudojant „Collection.sort“ (), todėl tiesiogiai skambinate „mylistcontainer.sort“ ()

Toliau pateikiamas kodo fragmentas, rodantis funkciją List.sort ():

 List<Fruit> fruits = new ArrayList<Fruit>(); fruits.add(new Fruit("Kiwi","green",40)); fruits.add(new Fruit("Banana","yellow",100)); fruits.add(new Fruit("Apple","mixed green,red",120)); fruits.add(new Fruit("Cherry","red",10)); // a) using an existing compareto() method fruits.sort((Fruit f1,Fruit f2) -> f1.getFruitName().compareTo(f2.getFruitName())); System.out.println("Using String.compareTo(): " + fruits); //Using String.compareTo(): [Apple is: mixed green,red, Banana is: yellow, Cherry is: red, Kiwi is: green] // b) Using a comparable class fruits.sort((Fruit f1,Fruit f2) -> f1.compareTo(f2)); System.out.println("Using a Comparable Fruit class (sort by color): " + fruits); // Using a Comparable Fruit class (sort by color): [Kiwi is green, Apple is: mixed green,red, Cherry is: red, Banana is: yellow] 

Vaisių klasė:

 public class Fruit implements Comparable<Fruit> { private String name; private String color; private int quantity; public Fruit(String name,String color,int quantity) { this.name = name; this.color = color; this.quantity = quantity;} public String getFruitName() { return name; } public String getColor() { return color; } public int getQuantity() { return quantity; } @Override public final int compareTo(Fruit f) // sorting the color { return this.color.compareTo(f.color); } @Override public String toString() { return (name + " is: " + color); } 

} // vaisių klasės pabaiga

0
31 мая '17 в 17:26 2017-05-31 17:26 atsakymą pateikė „ Norbert “ gegužės 17 d. 17:26 val