0

14000〜18000の範囲の整数キーを使用してマップを調べたい。それらを調べて、それらの相対的な違いを印刷したいと思います。したがって、3つのキー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>

さて、それはあなたが意図したものではない可能性があります。おそらく、各ノード間の違いが必要ですが、これは例が示しているものではありません。その場合、次のようにコレクションライブラリを活用します。

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 に答える