Soru Enum sabitlerine dayalı Java Sıralama


Bir numaramız var

enum listE {
    LE1,
    LE4,
    LE2,
    LE3
}

Ayrıca, dizeleri içeren bir liste var ["LE1","LE2","LE3","LE4"]. Listeyi enum tanımlı sıraya göre sıralamanın bir yolu var mı (doğal değil String sipariş).

Sıralanan liste olmalı ["LE1", "LE4", "LE2", "LE3"].


36
2017-11-04 09:23


Menşei




Cevaplar:


Enum<E> uygular Comparable<E> Enum'un doğal düzeni ile (değerlerin beyan edildiği sıra). Ayrıştırma yoluyla enum değerlerinin (dizelerin yerine) bir listesini oluşturursanız, bu listeyi kullanarak listeyi sıralayın. Collections.sortİstediğiniz şekilde sıralamalıdır. Tekrar dizelerin bir listesine ihtiyacınız varsa, yalnızca arayarak dönüştürebilirsiniz. name() her öğenin üzerinde.


56
2017-11-04 09:28



Bir EnumSet kullanırsanız, zaten sıraya göre sıralanır. ;) - Peter Lawrey
@PeterLawrey: İyi nokta - ama çiftler için başarısız olur :) - Jon Skeet
ters sıra ne olacak? - Igor G.


values() Yöntem, tanımlandığı sırayla döner.

enum Test{
  A,B,X,D
}

for(Test t: Test.values()){
  System.out.println(t);
}

Çıktı

A
B
X
D

6
2017-11-04 09:32



Bu, beyanname sırasına göre sıralamada yardımcı olmaz. - toolforger


Sıralamak için aşağıdakileri kullandım List<theEnum>  artan bir sırada ve benim için iyi çalıştı.

Collections.sort(toSortEnumList, new Comparator<theEnum>() {
                @Override
                public int compare(theEnum o1, theEnum o2) {
                    return o1.toString().compareTo(o2.toString());
                }
            });

4
2018-03-17 17:20



Bu, sorulan şeyin tam tersi: Sıralama değil sözlüksel olarak ancak beyanname ile. - toolforger


muhtemelen enum'un ordinal () yöntemine bakmalısınız, enum türünün enum sınıfında göründüğü konumun tamsayı değerini döndürür, böylece sizin durumunuzda LE1 = 0, LE4 = 1, vs. ...


2
2017-11-04 09:27





Her enum sabitinin bir sıra enum beyanındaki konumuna karşılık gelen değer. Dizeleriniz için karşılık gelen enum sabitinin sıra değerini kullanarak bir karşılaştırıcı yazabilirsiniz.


2
2017-11-04 09:29





public class Student implements Comparable<Student>{

    public String studentName;

    public Student(String name,DayInWeek weekDay){
        this.studentName = name;
        this.studentDays = weekDay;
    }

    public enum DayInWeek {
        SATURDAY,SUNDAY, MONDAY,TUESDAY, WEDNESDAY,THURSHDAY,FRIDAY
    }
    public DayInWeek studentDays;

    @Override
    public int compareTo(Student s1) {
        if(s1.studentDays.ordinal() < this.studentDays.ordinal())
            return 1;
        else if(s1.studentDays.ordinal() > this.studentDays.ordinal())
            return -1;
        else
            return 1;
    }
}

2
2018-04-08 10:15



Bu compareTo işlevi sözleşmesini başarısız: "sgn(x.compareTo(y)) == -sgn(y.compareTo(x)) tüm x ve y "için, bu durumda nerede başarısız olur x==y, resp. bu durumda this==s1. Ayrıca this!=s1 Durum daha kolay ve daha az hataya açık olarak uygulanacak return this.studentDays.compareTo(s1.studentDays). - toolforger


Kullanmaya çalışmak :

enum alanına ekle (sıralanmış alan)

sevmek

enum MyEnum{
 private String sorted;
 MyEnum(String sorted){
  this.sorted = sorted;
 }
 String getSorted(){
  return this.sorted;
 }
}

kullanım TreeSet

uygulamak Comparator kullanma MyEnum.sorted dosyalanmış


1
2017-11-04 09:30