2013-06-14 3 views
1

Im начинающий в Java. У меня есть следующий метод в Java:Использование карты для сложного ключа

public void filter(Long time_start, Long time_stop){ 
    ArrayList<Long> time = new ArrayList<Long>(); 
    ArrayList<Integer> stream = new ArrayList<Integer>(); 
    ArrayList<Integer> cpuid = new ArrayList<Integer>(); 
    ArrayList<Integer> token = new ArrayList<Integer>(); 
} 

Я получаю ввод от пользователя для time_start и time_stop, который передается этому методу. Время ArrayList содержит значение, введенное пользователем (оба: time_start и time_stop). Я хочу сделать следующее: для каждого заданного времени начала и окончания ... просмотрите время ArrayList и верните time, stream, cpuid and token, начиная с time_start и time_end. Каждое значение за время ArrayList уникально.

Как это сделать? Я знаю, что есть интерфейс Map в Java, но он может принимать только один ключ в качестве входных данных. Я хочу искать диапазон значений и выводить все поля, соответствующие этому диапазону.

Может ли кто-нибудь сказать мне правильный и лучший способ сделать это? ArrayLists времени, cpuid и т. Д. Иногда могут быть очень большими.

+0

Вы не можете объявлять переменные 'static' в методах. Ваш код не будет компилироваться. – fge

+0

@fge Мне жаль, что это не точный код ... – user2358330

+0

Удалить 'static', вы ищете' List '? – NINCOMPOOP

ответ

3

Вы можете использовать java.util.NavigableMap. В нем есть методы, позволяющие получать диапазоны, близкие совпадения и все, что вам нужно.

Вы должны определить класс для представления кортежа значений времени, потока, cpuid и токена для каждого события в одном объекте, а не для использования параллельных списков. На данный момент я буду называть этот класс Data.

Чтобы получить записи с ключами в диапазоне от time_start до time_stop, вы можете просто сделать это: отличные возможности OO

NavigableMap<Long,Data> myMap; 

public NavigableMap filter(Long time_start, Long time_stop){ 
    return myMap.subMap(time_start, time_stop); 
} 
+0

Эй Спасибо за ответ! У меня просто есть глупые сомнения, как распечатать все поля в пределах этого диапазона, возвращенные myMap.submap? Или как я могу получить доступ к каждому полю внутри этого подкапа отдельно? Скажем, я хочу напечатать только cpuid для этого диапазона? – user2358330

+1

@ user2358330 Вы можете получить к нему доступ, выполнив итерацию через набор записей подкарта (я бы сделал это с расширенным циклом for-loop, но это не единственный способ). Тип для итерированной переменной - это «Map.Entry », в котором есть члены ключа и значения, к которым вы можете получить доступ с помощью своих методов getter. Затем вы можете перейти на cpuid, обратившись к членам значения записи, которое относится к типу 'Data'. – AJMansfield

3

Use Java и создать что-то вроде

public class DataPoint { 
    startTime; 
    endTime; 
    stream; 
    cpuId; 
    token; 
} 

и магазин, который в вашем списке. И да, это не скомпилируется, я оставляю вам реальную реализацию.

+0

+1 намного лучше, чем использование нескольких списков! – Guillaume

+1

Я думаю, что OP означало, что каждое событие имеет только одно значение времени, и он хочет _retrieve_ datapoints со значениями между началом и концом. – AJMansfield

+0

@AJMansfield он мог (по сути, должен) по-прежнему использовать тот же принцип, за исключением, может быть, использовать карту для хранения (хотя это дает некоторую репликацию данных, она может быть быстрее для поиска на основе временной метки, чем повторение через Список и запрос члена извлеченного экземпляра). – jwenting

Смежные вопросы