我希望能够将文本中的特定单词添加到向量中。现在的问题是我想避免添加重复的字符串。我想到的第一件事是在添加之前比较所有字符串,随着条目数量的增长,这变得非常低效。我能想到的唯一“节省时间”的解决方案是unordered_multimap
C++11 中包含的容器。我找不到与之等效的Java。我正在考虑将字符串添加到地图中,最后只是将所有条目复制到向量中,这样它会比第一个解决方案更有效。现在我想知道是否有任何 Java 库可以满足我的要求?如果没有,在 Java 中是否有任何我找不到的 C++ unordered_multimap 容器等价物?
5 回答
您可以使用Set<String>
集合。它不允许重复。您可以选择 then 作为实现:
1)HashSet
如果您不关心元素(字符串)的顺序。
2)LinkedHashSet
如果你想保持元素的插入顺序。
3)TreeSet
如果您希望对元素进行排序。
例如:
Set<String> mySet = new TreeSet<String>();
mySet.add("a_String");
...
Vector
在 Java 中是“老式的”。你最好避免它。
您可以使用一个集合(java.util.Set):
Set<String> i_dont_allow_duplicates = new HashSet<String>();
i_dont_allow_duplicates.add(my_string);
i_dont_allow_duplicates.add(my_string); // wont add 'my_string' this time.
HashSet
将最有效地完成这项工作,如果你想保持插入顺序,那么你可以使用LinkedHashSet
.
使用Set
. HashSet
如果您不需要保持秩序,A会很好。LinkedHashSet
如果你需要的话,一个作品。
您应该考虑使用Set:
不包含重复元素的集合。更正式地说,集合不包含一对元素 e1 和 e2 使得 e1.equals(e2),并且最多包含一个空元素。正如它的名字所暗示的,这个接口模拟了数学集合抽象。
HashSet应该适合您的使用:
HashSet 类实现了 Set 接口,由一个哈希表(实际上是一个 HashMap 实例)支持。它不保证集合的迭代顺序;特别是,它不保证订单会随着时间的推移保持不变。此类允许空元素。
因此,只需像这样定义一个 Set 并适当地使用它:
Set<String> myStringSet = new HashSet<String>();
Set<String> set = new HashSet<String>();
hashCode 的一般合约是:
每当在 Java 应用程序执行期间对同一个对象多次调用它时,hashCode 方法必须始终返回相同的整数,前提是没有修改对象上的 equals 比较中使用的信息。
该整数不需要从应用程序的一次执行到同一应用程序的另一次执行保持一致。
如果两个对象根据 equals(Object) 方法相等,则对两个对象中的每一个调用 hashCode 方法必须产生相同的整数结果。
如果根据 equals(java.lang.Object) 方法,如果两个对象不相等,则不需要对两个对象中的每一个调用 hashCode 方法都必须产生不同的整数结果。但是,程序员应该意识到,为不相等的对象生成不同的整数结果可能会提高哈希表的性能。