같은 객체 목록 List<Object> p
이 있습니다. 객체 이름 필드를 사용하여이 목록을 알파벳순으로 정렬하고 싶습니다. 개체는 10 개의 필드를 포함하고 이름 필드는 그중 하나입니다.
if (list.size() > 0) {
Collections.sort(list, new Comparator<Campaign>() {
@Override
public int compare(final Object object1, final Object object2) {
return String.compare(object1.getName(), object2.getName());
}
} );
}
하지만 String.compare와 같은 것은 없습니다 ..?
답변
코드에서 Comparator
이미 Campaign
. 이것은에서만 작동합니다 List<Campaign>
. 또한 찾고있는 방법은 compareTo
.
if (list.size() > 0) {
Collections.sort(list, new Comparator<Campaign>() {
@Override
public int compare(final Campaign object1, final Campaign object2) {
return object1.getName().compareTo(object2.getName());
}
});
}
또는 Java 1.8을 사용하는 경우
list
.stream()
.sorted((object1, object2) -> object1.getName().compareTo(object2.getName()));
마지막으로, 목록 크기를 확인할 필요가 없습니다. 빈 목록에서 정렬이 작동합니다.
답변
알파벳순으로 문자열을 정렬하는 가장 올바른 방법 Collator
은 국제화 때문에 를 사용하는 것 입니다. 일부 언어는 추가 문자가 거의 없기 때문에 순서가 다릅니다.
Collator collator = Collator.getInstance(Locale.US);
if (!list.isEmpty()) {
Collections.sort(list, new Comparator<Campaign>() {
@Override
public int compare(Campaign c1, Campaign c2) {
//You should ensure that list doesn't contain null values!
return collator.compare(c1.getName(), c2.getName());
}
});
}
국제화에 관심이 없다면 string.compare(otherString)
.
if (!list.isEmpty()) {
Collections.sort(list, new Comparator<Campaign>() {
@Override
public int compare(Campaign c1, Campaign c2) {
//You should ensure that list doesn't contain null values!
return c1.getName().compare(c2.getName());
}
});
}
답변
Collections.sort()
및 Comparator
인터페이스를 살펴보십시오 .
object1.getName().compareTo(object2.getName())
또는 object2.getName().compareTo(object1.getName())
(원하는 정렬 방향에 따라)를 사용하여 문자열 비교를 수행 할 수 있습니다 .
대소 문자를 구분하지 않는 정렬을 원하면 object1.getName().toUpperCase().compareTo(object2.getName().toUpperCase())
.
답변
답변
public class ObjectComparator implements Comparator<Object> {
public int compare(Object obj1, Object obj2) {
return obj1.getName().compareTo(obj2.getName());
}
}
개체를 이름 필드가 포함 된 클래스로 바꾸십시오.
용법:
ObjectComparator comparator = new ObjectComparator();
Collections.sort(list, comparator);
답변
같은 것
List<FancyObject> theList = … ;
Collections.sort (theList,
new Comparator<FancyObject> ()
{ int compare (final FancyObject a, final FancyObject d)
{ return (a.getName().compareTo(d.getName())); }});
답변
다음은 List<T>
Reflection을 사용하고 타사 라이브러리를 사용하지 않는 객체의 지정된 String 속성에 대해 작동 하고 정렬 하는 Robert B의 답변 버전입니다.
/**
* Sorts a List by the specified String property name of the object.
*
* @param list
* @param propertyName
*/
public static <T> void sortList(List<T> list, final String propertyName) {
if (list.size() > 0) {
Collections.sort(list, new Comparator<T>() {
@Override
public int compare(final T object1, final T object2) {
String property1 = (String)ReflectionUtils.getSpecifiedFieldValue (propertyName, object1);
String property2 = (String)ReflectionUtils.getSpecifiedFieldValue (propertyName, object2);
return property1.compareToIgnoreCase (property2);
}
});
}
}
public static Object getSpecifiedFieldValue (String property, Object obj) {
Object result = null;
try {
Class<?> objectClass = obj.getClass();
Field objectField = getDeclaredField(property, objectClass);
if (objectField!=null) {
objectField.setAccessible(true);
result = objectField.get(obj);
}
} catch (Exception e) {
}
return result;
}
public static Field getDeclaredField(String fieldName, Class<?> type) {
Field result = null;
try {
result = type.getDeclaredField(fieldName);
} catch (Exception e) {
}
if (result == null) {
Class<?> superclass = type.getSuperclass();
if (superclass != null && !superclass.getName().equals("java.lang.Object")) {
return getDeclaredField(fieldName, type.getSuperclass());
}
}
return result;
}