[java] 개체 이름 필드를 사용하여 List <Object>를 알파벳순으로 정렬하는 방법

같은 객체 목록 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()).


답변

Java 8 Comparator.comparing 사용 :

list.sort(Comparator.comparing(Campaign::getName));


답변

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;
}