【问题标题】:Iterating over 2 maps in java在java中迭代2个地图
【发布时间】:2014-05-01 05:03:37
【问题描述】:

我有一种情况,我在地图上循环了两次,对我的算法不是特别满意,想知道是否有其他方法可以实现这一点。这是我正在努力实现的目标的简化版本。

import java.util.*;

public class DummyTest{

     public static void main(String []args){
         Map<String, String> someMap = new HashMap<>();
         someMap.put("Key1", "Value1");
         someMap.put("Key2", "Value2");
         someMap.put("Key3", "Value3");

         for (final Map.Entry<String, String> entry : someMap.entrySet()) {

            // I think this is a code smell - Is there a way to avoid this inner
            // loop and still get the same output?
            for (final Map.Entry<String, String> innerLoop : someMap.entrySet())
            {
                if (entry.getValue() != innerLoop.getValue()) {
                    System.out.println(entry.getValue() + " " +
                    innerLoop.getValue());
                }
            }
         }
     }
}

期望的输出

Value2 Value1
Value2 Value3

Value1 Value2
Value1 Value3

Value3 Value2
Value3 Value1

【问题讨论】:

  • 您是否尝试将每个键与其他键进行比较?
  • 不是真的比较而是用它做一些操作
  • Value2 Value3 这一行是否意味着与Value3 Value2 进行不同的比较?
  • @cementblocks 很好的链接! :) 这一行完美地总结了它:The complexity of cartesian product is O(n2), there is no shortcut.

标签: java


【解决方案1】:

我的解决方案同样低效,但不同的是低效。 试试这个:

... setup someMap however you want.

List<String> leftKeyList = new LinkedList<String>();
List<String> rightKeyList = new LinkedList<String>();

leftKeyList.addAll(someMap.keySet());
Collections.sort(leftKeyList); // you seem to want the keys sorted.

for (final String leftKey : leftKeyList)
{
    Set<String> rightKeySet = someMap.keySet());

    rightKeySet.remove(leftKey);

    rightKeyList.clear();
    rightKeyList.addAll(rightKeySet);
    Collections.sort(rightKeySet); // you seem to want these keys sorted as well.

    for (final String rightKey : rightSeyList)
    {
        System.out.println(leftKey + "   " + rightKey);
    }
}

编辑:如下所述,上面是 N^2。 我相信,任何时候您必须使用一组键中的一个键与同一组中的所有其他键配对做某事(上面打印),您都会遇到 n^2。 对于少量密钥,低效率不会杀死您。 100 个或更少的键,你应该不会有糟糕的表现。

Edit2:您提出的问题很有趣,因为它反映了一个经典的 SQL 连接错误,该错误是由于连接两个表但不使用连接列而导致的。这是一个示例sql:

select
    a.blah, b.hoot
from
    a, b

根据项目详细信息,可能值得将您的地图存储在一个表中,然后像这样将其连接到自身(在示例中,表名是 blammy):

select
   a.key, b.key
from
   blammy a,
   blammy b
where
   a.key != b.key

【讨论】:

  • 谢谢,正试图逃避N^2 操作,但看起来我别无选择
  • 这是一个很好的机会,可以更深入地了解您的数据类型,因为您知道自己是如何尝试遍历它的 :)
猜你喜欢
  • 2020-06-29
  • 2013-05-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多