当前位置: 首页 > 知识库问答 >
问题:

根据用户自定义输入按单个或多个属性对集合进行排序

东门城
2023-03-14

我有一个Item对象的集合,类Item如下->

class Item {
  String id;
  String brand;
  Integer price;
  Date publishedDate;
}

现在,我要根据用户输入进行排序。用户可以根据自己的选择(如品牌、价格或发布日期)对其进行排序,甚至可以使用多个参数。比如品牌和价格或者价格和发布日期。

我得到了一些使用策略设计模式的提示,但无法在这里实现来解决它。

共有1个答案

伯建安
2023-03-14

您可以为每个字段使用一个比较器的静态映射,并从中构建一个组合比较器:您仍然必须使比较器为空安全,并检查字段名称。

class Item {
    String id;
    String brand;
    Integer price;
    Date publishedDate;

    public Item(String id, String brand, Integer price, Date publishedDate) {
        super();
        this.id = id;
        this.brand = brand;
        this.price = price;
        this.publishedDate = publishedDate;
    }

    static Map<String, Comparator<Item>> comparatorMap = new HashMap<String, Comparator<Item>>() {
        {
            put("id", new Comparator<Item>() {
                @Override
                public int compare(Item o1, Item o2) {
                    return o1.id.compareTo(o2.id);
                }
            });
            put("brand", new Comparator<Item>() {
                @Override
                public int compare(Item o1, Item o2) {
                    return o1.brand.compareTo(o2.brand);
                }
            });
            put("price", new Comparator<Item>() {
                @Override
                public int compare(Item o1, Item o2) {
                    return o1.price.compareTo(o2.price);
                }
            });
            put("publishedDate", new Comparator<Item>() {
                @Override
                public int compare(Item o1, Item o2) {
                    return o1.publishedDate.compareTo(o2.publishedDate);
                }
            });
        }
    };

    @Override
    public String toString() {
        return "Item [id=" + id + ", brand=" + brand + ", price=" + price + ", publishedDate=" + publishedDate + "]";
    }

    static class ItemComparator implements Comparator<Item> {
        private List<Comparator<Item>> comparators;

        ItemComparator(String... fields) {
            comparators = new ArrayList<>();
            for (String field : fields) {
                comparators.add(comparatorMap.get((field)));
            }
        }

        @Override
        public int compare(Item o1, Item o2) {
            int result = 0;
            for (Comparator comparator : comparators) {
                result = comparator.compare(o1, o2);
                if (result != 0) {
                    return result;
                }
            }
            return result;
        }

    }

    static List<Item> sort(List<Item> list, String... fields) {
        Collections.sort(list, new ItemComparator(fields));
        return list;
    }

    public static void main(String[] args) {
        List<Item> list = new ArrayList<>();
        list.add(new Item("B", "A", 5, new Date()));
        list.add(new Item("A", "B", 7, new Date()));

        sort(list, "id", "price");
        System.out.println(list);
    }
}
 类似资料:
  • 问题内容: 我有一个对象的ArrayList。该对象包含属性和。所以我想对上的对象进行排序,对于同一日期的所有对象,我想对其进行排序。我怎样才能做到这一点? 问题答案: 实施自定义,然后使用。它可能看起来像这样:

  • 问题内容: 我有一个清单清单: 如果要按一个元素(例如,高/短元素)排序,可以通过进行。 如果我想作为排序依据两个高大和颜色,我可以为每个元素做排序两次,一次,但有一个更快的方法? 问题答案: 键可以是返回元组的函数: 或者,你可以使用来实现相同的效果(速度更快,并且避免了Python函数调用): 并请注意,你可以在此处使用而不是使用,然后重新分配:

  • 我读过关于使用比较器对数组列表进行排序的文章,但在所有示例中,人们都使用了,根据一些研究,这是一种用于字符串的方法。 我希望按照自定义对象的属性之一对其ArrayList进行排序:日期对象()。通常我会通过来比较它们,所以我想知道我是否可以写出如下内容:

  • 我试过了,但不起作用,二进制运算符'>'不能应用于两个'double?‘操作数 做这件事最方便快捷的方法是什么?

  • 问题内容: 我有以下收藏: 当这个样子的: 现在我必须根据字段对集合进行排序,如何实现呢? 问题答案: 这是我的“ 1班轮”: Java 8的更新:对于int数据类型 甚至: 对于String数据类型(如注释中所示) ..它期望吸气剂

  • 问题内容: 如何根据自定义属性排序ArrayList中的对象? 问题答案: 从实现,它就有一个像方法一样的方法。 因此,你的自定义设置应如下所示: 该方法必须返回一个,因此无论如何你都无法直接返回一个你计划中的。 你的排序代码几乎就像你写的那样: 如果你不需要重用比较器,则编写所有这些内容的一种更短的方法是将其编写为内联匿名类: 自从Java-8 现在,你可以通过使用lambda表达式来以较短的形