Listeyi alfabetik olarak nasıl sıralayabilirim?


Yanıtlar:


218

Bunların Dizeler olduğunu varsayarsak, uygun statik yöntemi kullanın sort

 java.util.Collections.sort(listOfCountryNames)

"İngiltere" gibi ülke adlarınız varsa, bu durum bozulacaktır.
Tom Hawtin - tackline

1
Bu durumda, bir Karşılaştırıcıyı fazladan bir argüman olarak iletebilirsiniz. Ancak Karşılaştırıcı'nın ilginç bir parçası olacağını söylemek.
Thilo

7
Karşılaştırıcıyı Uygulama = java.text.Collator.getInstance
Thilo

143

Collections.sort ile çözüm

Bu Listeyi kullanmak zorunda kalırsanız veya programınız aşağıdaki gibi bir yapıya sahipse

  • Liste Oluştur
  • Bazı ülke adları ekleyin
  • onları bir kez sırala
  • listeyi bir daha asla değiştirme

Thilos cevabı bunu yapmanın en iyi yolu olacaktır. Tom Hawtin - tackline'ın tavsiyesi ile birleştirirseniz , şunları elde edersiniz:

java.util.Collections.sort(listOfCountryNames, Collator.getInstance());

TreeSet ile çözüm

Karar vermekte özgürseniz ve uygulamanız daha karmaşık hale gelebilirse, bunun yerine bir TreeSet kullanmak için kodunuzu değiştirebilirsiniz. Bu tür bir koleksiyon girişlerinizi sadece eklendiklerinde sıralar. Sort () öğesini çağırmanıza gerek yoktur.

Collection<String> countryNames = 
    new TreeSet<String>(Collator.getInstance());
countryNames.add("UK");
countryNames.add("Germany");
countryNames.add("Australia");
// Tada... sorted.

TreeSet'i neden tercih ettiğime dair yan not

Bunun bazı ince ama önemli avantajları vardır:

  • Sadece daha kısa. Yine de sadece bir satır daha kısadır.
  • Endişelenmeyin , bu liste gerçekten şu anda sıralanıyor, çünkü ne yaparsanız yapın, bir TreeSet her zaman sıralanır.
  • Yinelenen girişleriniz olamaz. Durumunuza bağlı olarak bu bir profesyonel ya da aleyhte olabilir. Kopyalara ihtiyacınız varsa Listenize sadık kalın.
  • Deneyimli bir programcı bakar TreeSet<String> countyNamesve anında bilir: Bu yinelenen dizeleri sıralı bir koleksiyon ve bunun her an doğru olduğundan emin olabilirim . Kısa bir açıklamada çok fazla bilgi var.
  • Bazı durumlarda gerçek performans kazanır. Bir Liste kullanır ve değerleri çok sık eklerseniz ve liste bu eklemeler arasında okunabiliyorsa, listeyi her eklemeden sonra sıralamanız gerekir. Set aynı şeyi yapar, ancak çok daha hızlı yapar.

Doğru görev için doğru koleksiyonu kullanmak kısa ve hatasız kod yazmak için bir anahtardır. Bu durumda bu kadar açıklayıcı değil, çünkü sadece bir satır kaydedersiniz. Ancak yinelenen bir şey olmadığından emin olmak istediklerinde bir Listeyi kullanan birinin ne sıklıkta gördüğümü saymayı bıraktım ve sonra bu işlevselliği kendileri oluşturduk. Ya da daha kötüsü, gerçekten bir Haritaya ihtiyacınız olduğunda iki Liste kullanmak.

Beni yanlış anlamayın: Collections.sort kullanmak bir hata ya da kusur değildir. Ancak TreeSet'in çok daha temiz olduğu birçok durum var.


Sırala TreeSet'i kullanmanın herhangi bir avantajı yok.
DJClayworth

1
İyi TreeSet yanlışlıkla çoğaltmayı önler (iyi veya kötü olabilir) ve daha hızlı olmalıdır (giriş boyutu çok fazla olmasa da) ve her girişten sonra sıralamak yerine her zaman sıralanır (her birini sonra listelemediğiniz sürece) insert) önemli olabilir, ancak muhtemelen olmayabilir. Çok daha hızlı ..
TofuBeer

1
@TofuBeer Siz de bunu yaparken açıklığa kavuştum. Ve daha hızlı olanı gerçekten önemsiyorsanız, stackoverflow.com/questions/168891/…
Lena Schimmel

7
Öğeler değiştirilebilirse bir TreeSet sıralanmayacaktır.
Joshua Goldberg

3
@JoshuaGoldberg Bence sadece sıralanmamış olmayacak, aynı zamanda düzgün çalışmayı durduracak. En azından nesnenin mutasyonu, sıralama düzenini etkiliyorsa. Ağaç seti, görevlerini yerine getirmek için sıralanan öğelere dayanır (arama, kaldırma, ekleme ... gibi).
Lena Schimmel

29

Java 8 Stream veya Guava kullanarak yeni bir sıralanmış kopya oluşturabilirsiniz:

// Java 8 version
List<String> sortedNames = names.stream().sorted().collect(Collectors.toList());
// Guava version
List<String> sortedNames = Ordering.natural().sortedCopy(names); 

Başka bir seçenek de Koleksiyonlar API'sı aracılığıyla yerinde sıralamaktır:

Collections.sort(names);

28

Geç olsun güç olmasın! İşte bunu nasıl yapabiliriz (sadece öğrenme amaçlı) -

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

class SoftDrink {
    String name;
    String color;
    int volume; 

    SoftDrink (String name, String color, int volume) {
        this.name = name;
        this.color = color;
        this.volume = volume;
    }
}

public class ListItemComparision {
    public static void main (String...arg) {
        List<SoftDrink> softDrinkList = new ArrayList<SoftDrink>() ;
        softDrinkList .add(new SoftDrink("Faygo", "ColorOne", 4));
        softDrinkList .add(new SoftDrink("Fanta",  "ColorTwo", 3));
        softDrinkList .add(new SoftDrink("Frooti", "ColorThree", 2));       
        softDrinkList .add(new SoftDrink("Freshie", "ColorFour", 1));

        Collections.sort(softDrinkList, new Comparator() {
            @Override
            public int compare(Object softDrinkOne, Object softDrinkTwo) {
                //use instanceof to verify the references are indeed of the type in question
                return ((SoftDrink)softDrinkOne).name
                        .compareTo(((SoftDrink)softDrinkTwo).name);
            }
        }); 
        for (SoftDrink sd : softDrinkList) {
            System.out.println(sd.name + " - " + sd.color + " - " + sd.volume);
        }
        Collections.sort(softDrinkList, new Comparator() {
            @Override
            public int compare(Object softDrinkOne, Object softDrinkTwo) {
                //comparision for primitive int uses compareTo of the wrapper Integer
                return(new Integer(((SoftDrink)softDrinkOne).volume))
                        .compareTo(((SoftDrink)softDrinkTwo).volume);
            }
        });

        for (SoftDrink sd : softDrinkList) {
            System.out.println(sd.volume + " - " + sd.color + " - " + sd.name);
        }   
    }
}

4
Yine, bir satır ne zaman tüm bu kod için bir gerekçe yoktur. Lena'nın cevabına bakın.
james.garriss

1
Bu bir egzersiz olarak işe yarayabilir, ancak üretim kodunda hiç görseydim, bunu baltayım. hemen.
katzenhut

2
@ james.garriss, Lena'nın cevabı basit dize listesi içindi, bu sıralanacak dize niteliği içeren nesnenin listesi içindi.
Muneeb Mirza

Evet, bu cevap nesnelerle üretimde son derece yararlıdır. Dizelerin listesi o kadar da yaygın değildir.
Dominik K


9

İçin iki bağımsız değişkenini kullanın Collections.sort. Bu şekilde Comparatorelde edilebilecek gibi davayı uygun şekilde ele alan (UTF16 sıralamasında değil sözcüksel olan) bir uygunluk isteyeceksiniz java.text.Collator.getInstance.


9

Dizeleri yalnızca aksan içermeyen İngilizce olarak sıralamıyorsanız, muhtemelen bir Collator. Aksan işaretlerini doğru bir şekilde sıralar, büyük / küçük harf ve diğer dile özgü şeyleri yoksayabilir:

Collections.sort(countries, Collator.getInstance(new Locale(languageCode)));

Kollektör gücünü ayarlayabilirsiniz , bkz. Javadoc.

İşte Slovakya'ya nereye Šgitmesi gerektiğini gösteren bir örnek S, ancak UTF'de bir Šyer Z:

List<String> countries = Arrays.asList("Slovensko", "Švédsko", "Turecko");

Collections.sort(countries);
System.out.println(countries); // outputs [Slovensko, Turecko, Švédsko]

Collections.sort(countries, Collator.getInstance(new Locale("sk")));
System.out.println(countries); // outputs [Slovensko, Švédsko, Turecko]

7

İşte aradığınız şey

listOfCountryNames.sort(String::compareToIgnoreCase)

1
É è vb. Olan dillerde çalışmaz ... Daha önce aksanları çıkarmanız gerekir
Vincent D.

5

Kullanarak Collections.sort()bir listeyi sıralayabiliriz.

public class EmployeeList {

    public static void main(String[] args) {
        // TODO Auto-generated method stub

        List<String> empNames= new ArrayList<String>();

        empNames.add("sudheer");
        empNames.add("kumar");
        empNames.add("surendra");
        empNames.add("kb");

        if(!empNames.isEmpty()){

            for(String emp:empNames){

                System.out.println(emp);
            }

            Collections.sort(empNames);

            System.out.println(empNames);
        }
    }
}

çıktı:

sudheer
kumar
surendra
kb
[kb, kumar, sudheer, surendra]

4

azalan alfabe:

List<String> list;
...
Collections.sort(list);
Collections.reverse(list);

Aradığım şey buydu. Öncelikle listeyi tekrar AZ'ye, ardından karşılaştırma için ZA'ya sıralamam gerekiyor. İyi cevap.
japes Sophey

1

JAVA 8 ile aynı: -

//Assecnding order
        listOfCountryNames.stream().sorted().forEach((x) -> System.out.println(x));

//Decending order
        listOfCountryNames.stream().sorted((o1, o2) -> o2.compareTo(o1)).forEach((x) -> System.out.println(x));

0
//Here is sorted List alphabetically with syncronized
package com.mnas.technology.automation.utility;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Iterator;
import java.util.List;

import org.apache.log4j.Logger;
/**
* 
* @author manoj.kumar
*/
public class SynchronizedArrayList {
static Logger log = Logger.getLogger(SynchronizedArrayList.class.getName());
@SuppressWarnings("unchecked")
public static void main(String[] args) {

List<Employee> synchronizedList = Collections.synchronizedList(new ArrayList<Employee>());
synchronizedList.add(new Employee("Aditya"));
synchronizedList.add(new Employee("Siddharth"));
synchronizedList.add(new Employee("Manoj"));
Collections.sort(synchronizedList, new Comparator() {
public int compare(Object synchronizedListOne, Object synchronizedListTwo) {
//use instanceof to verify the references are indeed of the type in question
return ((Employee)synchronizedListOne).name
.compareTo(((Employee)synchronizedListTwo).name);
}
}); 
/*for( Employee sd : synchronizedList) {
log.info("Sorted Synchronized Array List..."+sd.name);
}*/

// when iterating over a synchronized list, we need to synchronize access to the synchronized list
synchronized (synchronizedList) {
Iterator<Employee> iterator = synchronizedList.iterator();
while (iterator.hasNext()) {
log.info("Sorted Synchronized Array List Items: " + iterator.next().name);
}
}

}
}
class Employee {
String name;
Employee (String name) {
this.name = name;

}
}

Ama neden? Lena'nın cevabındaki bu 50 kod satırını kullanmak 1 kod satırından neden daha iyi?
james.garriss

Çünkü, listeyi belirtilen karşılaştırıcı tarafından indüklenen sıraya göre sıralamak için sort (List <T>, Comparator <? Super T>) yöntemi kullanılır. Emplpyee listesini adlarına ve yaşlarına göre sıralamak istediğinizde Koleksiyonlar sıralama (Liste, Karşılaştırıcı) yöntemini kullanın

Hayır, üzgünüm, burada hiç aşk hissetmiyorum. Farklı bir soruyu, yani Nesne Listesinin özelliklerine göre nasıl sıralanacağını cevaplıyorsunuz. Kodunuz bu amaç için yararlı olabilir, ancak OP sorusu aşırı derecede abartılıdır. :-(
james.garriss

-12

Yaptığım bir yöntemi kullanmayı deneyebilirsiniz.

String key- İstediğiniz sıra ve bu durumda alfabetik olarak olacaktır. Sadece "abc ..." koy.

String list[] - tuşunu kullanarak sıraya koymak istediğiniz liste.

int index - 0 olarak ayarlandığında, tuşun ofsetini ayarlar.

    public static String[] order(String key, String list[], int index) {
    ArrayList<String> order_List = new ArrayList<String>();
    ArrayList<String> temp_Order_List = null;
    char[] key_char = key.toCharArray();
    for (int offset = 0; offset < key_char.length; offset++) {
        if (key_char.length >= offset + index) {
            String str = (index > 1 ? list[0].substring(0, index - 1) : "")
                    + new String(key_char, offset, 1);
            for (int i = 0; i < list.length; i++) {
                temp_Order_List = new ArrayList<String>();
                for (int k = 0; k < list.length; k++) {
                    if (!order_List.contains(list[k])
                            && !temp_Order_List.contains(list[k])) {
                        if (list[k].equalsIgnoreCase(str))
                            order_List.add(list[k]);
                        else if (list[k].toLowerCase().startsWith(str.toLowerCase())) {
                            temp_Order_List.add(list[k]);

                        }
                    }
                }
                if (temp_Order_List.size() > 0) {
                    if (temp_Order_List.size() > 1) {
                        String[] add = order(key,
                                temp_Order_List.toArray(new String[temp_Order_List
                                        .size()]), index + 1);
                        for (String s : add) {
                            order_List.add(s);
                        }
                    } else {
                        order_List.add(temp_Order_List.get(0));
                    }
                }
            }
        }
    }
    return order_List.toArray(new String[order_List.size()]);
}

32
Tabii, neden 30 satır kod yazabilirsem java.util.Collections.sort (list) kullanmalıyım :)
Jirka

1
Neden bu kadar çok oy yok? Herkes bu kodu çalıştırmak veya kullanılan algoritmayı anlamaya çalışıyor mu?
JBoy
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.