Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 集合映射中的上一个和下一个元素_Java - Fatal编程技术网

Java 集合映射中的上一个和下一个元素

Java 集合映射中的上一个和下一个元素,java,Java,我有一张这样的地图: Map <Set<String>,Set<Integer>> myMap = new LinkedHashMap<Set<String>, Set<Integer>>(); Map myMap=newlinkedhashmap(); 我需要对它进行迭代,但在迭代的过程中,我需要跟踪下一个和上一个条目,并对它们执行一些操作。 类似这样的东西,但这段代码不正确,我似乎不知道如何获取键的值: String

我有一张这样的地图:

Map <Set<String>,Set<Integer>> myMap = new LinkedHashMap<Set<String>, Set<Integer>>();
Map myMap=newlinkedhashmap();
我需要对它进行迭代,但在迭代的过程中,我需要跟踪下一个和上一个条目,并对它们执行一些操作。 类似这样的东西,但这段代码不正确,我似乎不知道如何获取键的值:

String previous = null;

                for (Entry<Set<String>, Set<Integer>> entry : nnpMap.entrySet()){


                    for (Iterator<String> i = entry.getKey().iterator(); i.hasNext();){
                        int nnpStartIndex;
                        int nnpEndIndex;

                        String element = i.next();

                        if (previous == null){
                            previous = element;
                        }
stringprevious=null;
对于(条目:nnpMap.entrySet()){
for(迭代器i=entry.getKey().Iterator();i.hasNext();){
国际nnpStartIndex;
int指数;
String元素=i.next();
如果(上一个==null){
先前=元素;
}

条目对象具有getKey和getValue对,可用于查找条目的key和value对象。
参见javadoc:

没有从迭代器中获取下一个元素的方法。确实有,但是这样做,您将使其成为当前元素。因此解决方案是跟踪前两个元素,并假设前一个元素是当前元素,而当前元素是下一个元素:

    String previous = null;
    String current = null;
    for (Set<String> key : myMap.keySet()) {
        for (String next : key) {
            if (current != null) {
                doSomeOperation(previous, current, next);
            }
            previous = current;
            current = next;
        }
    }
    if (current != null) { // if all sets were empty, current is still null
        doSomeOperation(previous, current, null);
    }
-然后对
doSomeOperation()
的调用将是:

doSomeOperation(null, "a", "b")
doSomeOperation("a", "b", "q")
doSomeOperation("b", "q", "c")
doSomeOperation("q", "c", "x")
doSomeOperation("c", "x", null)

您会注意到,正如在注释中所讨论的,因为我对内部集合使用了
HashSet
,所以它们的元素的顺序可能既不是插入顺序,也不是字母顺序。

Map.Entry没有任何entrySet()方法。它有一个getKey(),返回条目的键(在本例中是一个集合)和一个getValue(),它返回条目的值(本例中为一个集合)。此外,如果它为空,您还将初始化
previous
。因此previous将始终是映射的第一个键的第一个元素。而且它们不会以任何特定顺序返回。因此,对“上一个”和“下一个”进行操作似乎是随机的。但我想您已经意识到了这一点(条目:nnpMap.entrySet()){但它应该是(条目:myMap.entrySet())的
){
@efekActive,由于此映射是一个
LinkedHashMap
,因此定义了元素的顺序。稍后有人更改了其他映射的LinkedHashMap,而你们有一个错误。我得到了这个错误。我的主要问题是从映射中获取上一个和下一个元素。映射中的元素没有定义顺序。您可能需要使用其他一些元素数据结构来按您想要的顺序存储键。如果您真的非常想这样做,您可以在entryset上使用迭代器来查找下一个值
doSomeOperation(null, "a", "b")
doSomeOperation("a", "b", "q")
doSomeOperation("b", "q", "c")
doSomeOperation("q", "c", "x")
doSomeOperation("c", "x", null)