【问题标题】:Searching within Pair in java在Java中的Pair内搜索
【发布时间】:2013-10-06 05:28:56
【问题描述】:

我想在Pair<String,int> 中搜索特定的String 元素。我正在使用简单的equals 方法来执行此操作。请为此建议我任何其他有用的技术。 String 列表至少有 10000 个元素。

for (String str1 : StringList) {
    for (Pair<?, ?> pair : nodeList) {
        if (pair.getFirst().equals(str1)) {
            // Some code here...            
        }
    }
}

【问题讨论】:

  • 你的意思是要在10000个字符串中搜索一个字符串?
  • 找到pair后要执行什么操作?
  • 我也想用 HashSet 代替 List 但不知道它比使用 list 花费的时间更多。
  • @engineer2014:你能粘贴整个代码吗?目前还不是很清楚你要做什么。使用HashSet 不会花费更长的时间。

标签: java search collections


【解决方案1】:

我认为您应该为此使用HashMap。它包含 key->value 之类的对,您可以使用 containsKeycontainsValue 方法轻松检查两者是否存在。

【讨论】:

    【解决方案2】:

    对超过 10000 条记录进行顺序扫描并执行 String.equals() 操作会很慢。考虑改用 HashMap,其中键是每对中的第一个(字符串),值是第二个(整数):

    Map<String, Integer> map = //... get your map
    
    for (String str : stringList) {
       Integer found = map.get(str);
       if (found!=null) {
          // Some code here...
       }
    }
    

    【讨论】:

      【解决方案3】:

      如果您想反复检查您的StringList 是否包含特定的String,最好使用HashSet&lt;String&gt;

      使用HashSet.contains() 方法检查您的字符串是否存在 - 这样,您将在 O(1) 时间内立即获得返回值,而不必遍历所有元素。

      【讨论】:

        【解决方案4】:

        使用HashSet 而不是列表。它将复杂度降低到 O(n),而不是现在的 O(n^2)。

        【讨论】:

        • 使用HashSet后如何获取pair?
        • 一个集合实际上会有所帮助,但需要一个自定义的 equals 和 hashCode,所以它并不像你的答案所说的那么简单。
        • @pcalcao 看起来是他正在使用的字符串,并且它们已经有适当的等号和 hashCode。
        • 不,他使用的是弦对。 Pair 将使用 Object 的默认 hashCode 和 equals。他想找到第一个元素等于字符串的 Pair。此外,您的复杂性完全错误。
        • @pcalcao 是的,如果他需要获取 Pair 对象,则需要将第一个 String 映射到对的 HashMap(尽管他没有指定他将执行什么处理)。复杂性有什么问题?一个内部循环是 O(n^2) 并且由于 hashset(或 hashmap 的 containsKey)是 O(1),这会将它降低到 O(n)。
        【解决方案5】:

        如果我正确理解您的问题,您想在列表中搜索特定的一对字符串。那个特定的 Pair 第一个元素必须与您要查找的字符串匹配,对吗?

        好吧,如果您的列表没有以任何方式排序,那么您就不走运了。遍历所有元素并搜索它。

        如果列表是有序的(按 Pair 的第一个元素的顺序),那么您可以使用二分搜索来更快地完成它。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2010-11-06
          • 2011-08-23
          • 2023-03-21
          • 2010-11-02
          • 2012-08-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多