Відповіді:
Припускаючи, що це рядки, використовуйте зручний статичний метод sort
...
java.util.Collections.sort(listOfCountryNames)
Якщо ви змушені використовувати цей Список, або якщо ваша програма має подібну структуру
тоді відповідь Тілоса буде найкращим способом це зробити. Якщо ви поєднаєте це з порадою Тома Хотіна - таклін , ви отримаєте:
java.util.Collections.sort(listOfCountryNames, Collator.getInstance());
Якщо ви можете вирішити, і якщо ваша програма може стати складнішою, ви можете змінити свій код, щоб замість цього використовувати TreeSet. Цей вид колекції сортує ваші записи лише тоді, коли вони вставлені. Не потрібно дзвонити sort ().
Collection<String> countryNames =
new TreeSet<String>(Collator.getInstance());
countryNames.add("UK");
countryNames.add("Germany");
countryNames.add("Australia");
// Tada... sorted.
Це має деякі тонкі, але важливі переваги:
TreeSet<String> countyNames
і миттєво знає: це відсортована колекція Strings без дублікатів, і я можу бути впевнений, що це правда щоразу . Стільки інформації в короткій декларації.Використання правильної колекції для правильного завдання - це ключ для написання короткого та помилкового коду. У цьому випадку це не так демонстративно, тому що ви просто зберігаєте один рядок. Але я перестала рахувати, як часто я бачу когось, хто використовує Список, коли вони хочуть переконатися, що немає дублікатів, а потім створити цю функціональність самостійно. Або ще гірше, використовуючи два списки, коли вам справді потрібна карта.
Не зрозумійте мене неправильно: Використання Collections.sort - це не помилка чи недолік. Але є багато випадків, коли TreeSet набагато чистіший.
Ви можете створити нову відсортовану копію за допомогою Java 8 Stream або Guava:
// Java 8 version
List<String> sortedNames = names.stream().sorted().collect(Collectors.toList());
// Guava version
List<String> sortedNames = Ordering.natural().sortedCopy(names);
Ще один варіант - це сортування на місці за допомогою API колекцій:
Collections.sort(names);
Краще пізно, ніж ніколи! Ось як ми можемо це зробити (лише для навчальних цілей) -
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);
}
}
}
В одному рядку, використовуючи Java 8:
list.sort(Comparator.naturalOrder());
Використовуйте два аргументи для Collections.sort
. Ви хочете, щоб відповідне Comparator
ставлення до випадків (тобто лексичне, а не впорядкування UTF16) було таким, як це можна отримати java.text.Collator.getInstance
.
Якщо ви не сортуєте рядки лише на англійській мові, що не має акценту, ви, ймовірно, хочете використовувати Collator
. Він буде правильно сортувати діакритичні позначки, може ігнорувати регістр та інші конкретні мови:
Collections.sort(countries, Collator.getInstance(new Locale(languageCode)));
Ви можете встановити силу колектора , побачити javadoc.
Ось приклад для словацької мови, куди Š
слід йти S
, але в UTF Š
десь після 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]
Ось що ви шукаєте
listOfCountryNames.sort(String::compareToIgnoreCase)
Використовуючи Collections.sort()
, ми можемо сортувати список.
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);
}
}
}
вихід:
sudheer
kumar
surendra
kb
[kb, kumar, sudheer, surendra]
низхідний алфавіт:
List<String> list;
...
Collections.sort(list);
Collections.reverse(list);
Те саме в JAVA 8: -
//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));
//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;
}
}
Ви можете спробувати використовувати метод, який я створив.
String key
- буде порядок, який ви хочете, і в цьому випадку в алфавітному порядку. Просто поставте "abc ...".
String list[]
- список, який ви хочете привести в порядок за допомогою ключа.
int index
- встановити як 0, встановить зсув для ключа.
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()]);
}