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