【问题标题】:Java Comparator Interface NullsLast with anonymous inner class带有匿名内部类的 Java 比较器接口 NullsLast
【发布时间】:2020-07-18 19:41:13
【问题描述】:

我创建了一个方法,该方法根据给定的实体(我使用 JPA)返回 java 中的表的原始 html。现在我希望能够使用比较器交互对表格进行排序。所以我创建了一个比较器接口的匿名内部类,以对实体的属性进行排序。这很好用,但我现在的问题是我无法对 NullsFirst 或 Nullslast 进行排序。我尝试过的一切都不起作用。有谁知道如何解决这个问题?

这是代码:

if (!sortProperty.equals("") && sortProperty != null) {
        Collections.sort(list, new Comparator<T>() {
            public int compare(T e1, T e2) {
                Method sortGetter = null;
                try {
                    for (PropertyDescriptor pd : Introspector.getBeanInfo(entity).getPropertyDescriptors()) {
                        if (pd.getName().equals(sortProperty) && pd.getReadMethod() != null) {
                            sortGetter = pd.getReadMethod();
                        }
                    }
                } catch (IntrospectionException e) {
                    e.printStackTrace();
                }

                try {
                        if (sortGetter.getReturnType().equals(String.class)) {
                            return sortGetter.invoke(e1).toString().compareTo(sortGetter.invoke(e2).toString());
                        } else if (sortGetter.getReturnType().equals(Integer.TYPE)) {
                                return (Integer) sortGetter.invoke(e1) - (Integer) sortGetter.invoke(e2);
                        } else if (sortGetter.getReturnType().equals(Date.class)) {
                                return ((Date) sortGetter.invoke(e1)).compareTo((Date) sortGetter.invoke(e2));
                        } else if (sortGetter.getReturnType().equals(Timestamp.class)) {
                                return ((Timestamp) sortGetter.invoke(e1)).compareTo((Timestamp) sortGetter.invoke(e2));
                        }
                } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
                    e.printStackTrace();
                }
                return 0;
            }
        });
    }

【问题讨论】:

  • “我试过的一切都不起作用。有人知道如何解决这个问题吗?”你试过什么?在什么意义上它没有“解决”?

标签: java sorting generics comparator


【解决方案1】:

将您的sortGetter.invoke(e1)sortGetter.invoke(e2) 提取到变量中(为清楚起见省略了try/catch):

Object o1 = sortGetter.invoke(e1);
Object o2 = sortGetter.invoke(e2);

检查其中一个是否为空,如果是,则返回:

if (o1 == null || o2 == null) {
  // This results in nulls last. Use != for nulls first.
  return Boolean.compare(o1 == null, o2 == null);
}

现在您可以继续您的 if (sortGetter.getReturnType().equals(String.class)) 类型的逻辑(您显然不需要再次调用 sortGetter.invoke(e1)sortGetter.invoke(e2))。

【讨论】:

    最近更新 更多