I-1 доступ к TreeMap - PullRequest
       20

I-1 доступ к TreeMap

0 голосов
/ 16 октября 2011

Я хочу просмотреть карту с целочисленными ключами в диапазоне 14000-18000. Я хочу пройтись по ним и распечатать относительную разницу между ними. Таким образом, если бы было три клавиши 14152 и 14153, 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 голосов
/ 16 октября 2011

Самый простой и быстрый способ, я думаю: вы можете сохранить последнюю запись во временной переменной и использовать ее только на следующей итерации.Не забудьте изменить его в конце каждой итерации.

2 голосов
/ 16 октября 2011

Почему бы вам не держать его в отдельной переменной?

//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;
}
2 голосов
/ 16 октября 2011

Когда вы выполняете итерацию, вы знаете, что сначала у вас наименьшее значение. Поэтому я бы сделал что-то вроде этого:

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));
}

Вот пример этого, если это то, что Ою на самом деле намеревался:

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>
0 голосов
/ 17 октября 2011

Я не очень хорошо объяснил свой вопрос. Извините ребята. Я хотел кумулятивный промежуточный итог. Это то, что я сделал, объединив ваши ответы:

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;
}
...