0

我想通过一个整数键在 14000-18000 范围内的映射。我想浏览它们并打印它们之间的相对差异。因此,如果有三个键1415214153, 14159,则打印输出将是0, 1, 7

我已将键和值放入 TreeMap,因为它按顺序存储内容。

但是,通过我的实现:

int dayCounter = 0;

for (Entry<Integer, String> entry : map.entrySet())
{
    builder.append(dayCounter);
    dayCounter = entry.getKey();
}

我正在浏览地图,但不知道如何获得“上一个”条目。如果我使用的是数组,我可以获得(i-1)th值并从中减去i以获得相对值。有没有办法使用 java 地图获得功能?

4

4 回答 4

4

我认为最简单和最快的方法:您可以将最后一个条目存储在临时变量中,并仅在下一次迭代中使用它。不要忘记在每次迭代结束时对其进行修改。

于 2011-10-16T13:08:48.497 回答
2

当你迭代时,你知道你首先有最小值。所以我会做这样的事情:

Integer first = null;

for(Integer i : map.keySet()) {
    if(first == null) first = i; // save the first value
    builder.append(i - first);
}

使用您的示例:

import java.util.TreeMap;
class Eggonlegs {
    public static void main(String[] args) {
        TreeMap<Integer,String> map = new TreeMap<Integer,String>();
        map.put(14152,"First");
        map.put(14153,"Second");
        map.put(14159,"Third");

        Integer first = null;

        for(Integer i : map.keySet()) {
            if(first == null) first = i; // save the first value
            System.out.println(i - first);
        }
    }
}

结果是

c:\files>javac Eggonlegs.java

c:\files>java Eggonlegs
0
1
7

c:\files>

现在,这可能不是您想要的。也许您想要每个节点之间的差异,这不是您的示例所显示的。在这种情况下,我会像这样利用 Collections 库:

List<Integer> list = new ArrayList<Integer>(map.keySet());

for(int i = 0; i < list.size(); i++) {
    if(i == 0) builder.append(0);
    else builder.append(list.get(i) - list.get(i-1));
}

这是一个示例,以防它是 oyu 的实际意图:

import java.util.ArrayList;
import java.util.List;
import java.util.TreeMap;
class Eggonlegs {
    public static void main(String[] args) {
        TreeMap<Integer,String> map = new TreeMap<Integer,String>();
        map.put(14152,"First");
        map.put(14153,"Second");
        map.put(14159,"Third");

        List<Integer> list = new ArrayList<Integer>(map.keySet());

        for(int i = 0; i < list.size(); i++) {
            if(i == 0) System.out.println(0);
            else System.out.println(list.get(i) - list.get(i-1));
        }
    }
}

结果是

c:\files>javac Eggonlegs.java

c:\files>java Eggonlegs
0
1
6

c:\files>
于 2011-10-16T13:09:47.020 回答
2

你为什么不把它放在一个单独的变量中?

//Warning : Notepad coding.
int hold_prev_key = -1;

for(int key : map.keySet())
{
   if(hold_prev_key != -1)
      builder.append(key -  hold_prev_key);
   hold_prev_key =  key;
}
于 2011-10-16T13:11:40.923 回答
0

我没有很好地解释我的问题。对不起大家。我想要一个累积的运行总数。这就是我通过结合您的答案所做的:

int hold_previous_key = 0;
int difference = 0;
int running_total = 0;

for (int key : map.keySet())
{
    if (hold_previous_key != 0)
    {
        difference = key - hold_previous_key;
        running_total += difference;
        builder.append(key + " - " + hold_previous_key + " = " + difference + " RUNNING TOTAL = " + running_total + "; ");
    }
    else
    {
        // print 0 for the first date in the data set
        builder.append("first val = 0" + "; ");
    }

    hold_previous_key = key;
}
于 2011-10-17T03:55:08.393 回答