【问题标题】:Best collection in Java for user defined object to search using two comparators使用两个比较器搜索用户定义对象的最佳 Java 集合
【发布时间】:2015-04-18 13:12:44
【问题描述】:

我想要一个 Java 集合,它可以更快地搜索并带有两个比较器(一个比较对象的 Int 成员,另一个比较对象的 String 成员)。

任何收藏都可以吗?

其次,我将从 db2 加载数据到对象集合(包含 2 个 Int、2 个字符串和 2 个对象引用)。从数据库加载的行数最多可以达到 10000。那么会不会有任何与内存相关的问题或 JVM 会管理它?

【问题讨论】:

  • 有了这样的卷,你不应该担心内存。
  • 谢谢@nikis!关于我的第一个疑问有什么建议吗?
  • 用比较器搜索是什么意思?您是说要对数据进行排序吗?您是说您希望数据是唯一的,具有由比较器定义的唯一性?
  • 我的意思是我可以将 collection.binarysearch 与该集合一起使用。并且可以搜索并找到具有与搜索键匹配的特定字段的对象
  • 在这种情况下,您需要两个ArrayLists,每个都使用不同的比较器进行排序。

标签: java memory memory-management collections out-of-memory


【解决方案1】:

如你所说,你可以定义两个比较器。

import java.util.Comparator;

public class MyObject {
    private final int intProperty;
    private final String stringProperty;

    public MyObject(int intProperty, String stringProperty) {
        this.intProperty = intProperty;
        this.stringProperty = stringProperty;
    }

    public int getIntProperty() {
        return intProperty;
    }

    public String getStringProperty() {
        return stringProperty;
    }

    public static final Comparator<MyObject> intComparator = new Comparator<MyObject>() {
        @Override
        public int compare(MyObject o1, MyObject o2) {
             return o1.getIntProperty() == o2.getIntProperty() ? 0 : (o1.getIntProperty() < o2.getIntProperty() ? -1 : 1);
        }
    };

    public static final Comparator<MyObject> stringComparator = new Comparator<MyObject>() {
        @Override
        public int compare(MyObject o1, MyObject o2) {
            return o1.getStringProperty().compareTo(o2.getStringProperty());
        }
    };
};

制作一个可变列表,这是Collections.sort 将接受的唯一输入:

List<MyObject> objects = new ArrayList<>(Arrays.asList(new MyObject(1, "xyz"), new MyObject(2, "abc")));

然后:

Collections.sort(myObjects, MyObject.intComparator);  // (1, "xyz"), (2, "abc")

或者:

Collections.sort(myObjects, MyObject.stringComparator);  // (2, "abc"), (1, "xyz")

您还可以将这些比较器与其他常见数据结构一起使用:

SortedSet<MyObject> objectSet = new TreeSet<>(MyObject.intComparator);
objectSet.addAll(Arrays.asList(new MyObject(1, "c"), new MyObject(2, "b"));

【讨论】:

  • 谢谢!但在上面的例子中,myObjects 的可能集合是什么?
  • @user3733814,请参阅上面的更新。 Collections.sort 只能对List 进行排序,可能是因为List 是基本有序的Collection
  • 最后一个问题...可以有效地使用树集或哈希集来查找具有 intProperty ==search_Key 的对象吗?因为他们不允许我的应用程序更好地重复和套件。
  • 是的,@user3733814。您绝对可以使用TreeSet(Comparator&lt;? super E&gt; comparator) 构造函数来创建一个按您想要的键排序的SortedSet。一个普通的HashSet 当然不会给你排序语义。看看我上面的编辑。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多