2014-01-28 2 views
4

У меня есть метод, который спящий режим, через который один я получаю список, как показано ниже ..итерация по списку, который имеет тип объекта

List<abcObject> aaList= session.createCriteria(abcObject.class)

Теперь при осмотре я обнаружил, что тип списка имеет тип объекта, поскольку критерии апи возвращают нам список типов объектов

Теперь список утра принимающий что в следующем моде, которая ..

t_id value 
    11  3 
    12  20 
    14  60 
    15  17 ------->(3+20+60+17 =100),here min =11 & max =15 
    18  40 
    22  20 
    33  40 
    45  20 ---------->(40+20+40+20 =100),here min =18 & max =45 

Теперь, пожалуйста, сообщите, как мне нужно перебирать список таким образом, чтобы, если количество значений достигает 100, тогда должна быть создана отдельная карта, которая будет иметь значение , а значение будет макс, теперь карта строкового типа

min  max 

11  15 
18  45 

, а также заботиться должна быть принято таким образом, что этот параметр, на котором разделение делается это 100 должно быть настраиваемыми иногда он может быть установлен на 60 и поэтому этот параметр деления должен быть конфигурируемым

поэтому, наконец, я хочу создать другую карту, которая является типом строки, так что min и max имеют строку типа в этом списке и сохраняются таким образом, как показано ниже.

min  max 

11  15 
18  45 

Пожалуйста, сообщите, как достичь этого в java, поскольку список относится к типу объекта.

Я попробовал некоторые, что это, но это не правильно ..

final int BARRIER = 100; 

    //I am going to assume there are getter methods in you abcObject and 
    //that all values are greater than 0 
    List<abcObject> minMaxs = new List<abcObject>(); 
    int sum = 0; 
    int min = 0; 
    for (abcObject obj: aaList) { 
     if (sum == 0) { 
      //start over, remember min 
      min = obj.getT_id(); 
     } 
     //add value to sum 
     sum += obj.getValue(); 
     if (sum >= BARRIER) { 
      //now we need to start again, remember what we got 
      minMaxs.add(new abcObject(min, obj.getT_id())); 
      //reset 
      min = 0; 
      sum = 0; 
     } 
    } 
+0

Если я правильно понял, это типичная проблема с рюкзаком (http://en.wikipedia.org/wiki/Knapsack_problem). Существует множество примеров реализации. –

+0

@Andae Я уже искал в google, но не смог найти точного решения –

+0

Возможный дубликат http://stackoverflow.com/questions/21398178/iterating-over-list-and-storing-it-contents-over- -карта/21399309 # 21399309 –

ответ

0

Я предполагаю, что вам просто нужно пройти по списку и сосчитать до BARRIER и найти минимальное и максимальное с тем, что ведро. Если да, то это не knapsack.

int sum = 0; 
int min = 0; 
int max = 0; 
for (abcObject obj: aaList) { 
    int tId = obj.getT_id(); 
    if (sum == 0) { 
     //start over, remember min 
     min = tId; 
     max = min; 
    } 
    //add value to sum 
    sum += obj.getValue(); 
    min = tId < min ? tId : min; //check if tId is lesser than min 
    max = tId > max ? tId : max; //check if tId is greater than max 
    if (sum >= BARRIER) { 
     //now we need to start again, remember what we got 
     minMaxs.add(new abcObject(min, max)); 
     //reset 
     min = 0; 
     max = min; 
     sum = 0; 
    } 
} 

Вышеуказанный способ должен работать. Все, что мы делаем здесь, сравнивается, если min меньше тока, а max больше, чем ток.

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