2016-06-28 6 views
-1

Вот ArrayList пунктов:Как получить предыдущее значение ArrayList?

Пункт 1: (вес: 4, прибыль: 5)
Пункт 2: (вес: 10, прибыль: 12)
Пункт 3: (вес: 5, прибыль : 8)

и емкость = 11 и случайный бит, подлежащий переворачиванию (если 0 станет 1 и наоборот):
orderList = [2,0,1].

мой код:

'

public class BitString { 
    public static void main (String[] args){ 
    int n = 3, capacity = 11, pointer, toFlip; 

    ArrayList<Item> itemList = new ArrayList<Item>(); 
    ArrayList<Integer> solution = new ArrayList<Integer>(); 
    ArrayList<Integer> currentSolution = new ArrayList<Integer>(); 
    ArrayList<Integer> flipOrder = new ArrayList<Integer>(); 
    ArrayList<ArrayList<Integer>> improve = new ArrayList<ArrayList<Integer>>(); 

    itemList.add(new Item(4,5)); 
    itemList.add(new Item(10,12)); 
    itemList.add(new Item(5,8)); 

    solution = initialSolution(n); 
    currentSolution = solution; 
    flipOrder = randomFlipOrder(n); 

    System.out.println("List of Items: " + itemList); 
    System.out.println("Initial solution: " + solution); 
    System.out.println("Current solution: " + currentSolution); 
    System.out.println("Random order: " + flipOrder); 

    for (int i = 0; i < flipOrder.size(); i++){ 
     int totalWeight = 0, totalProfit = 0; 

     pointer = flipOrder.get(i); 
     toFlip = solution.get(pointer); 

     System.out.println(); 

     for (int j = 0; j < solution.size(); j++){ 
      if (solution.get(j) == 1){ 
       totalWeight += itemList.get(j).getWeight(); 
       totalProfit += itemList.get(j).getProfit(); 
      } 
     } 

     System.out.println("Total Weight For Solution " + solution + " : " + totalWeight + " | Total Profit For Solution " + solution + " : " + totalProfit); 

     if (totalWeight <= capacity){ 
      System.out.println(totalWeight + " NOT EXCEED CAPACITY FOR SOLUTION: " + solution); 
      currentSolution = solution; 
      improve.add(currentSolution); 
      System.out.println("Updated Current Solution: " + solution); 
      System.out.println("Updated Improved: " + improve); 

      //do the flipping bits 
      if (toFlip == 1) 
       solution.set(pointer, 0); 
      else 
       solution.set(pointer, 1); 

      System.out.println("New Solution After flip: " + solution); 
      //improve.remove(0); 
     } 
     else{ 
      System.out.println(totalWeight + " EXCEEDS CAPACITY FOR SOLUTION: " + solution); 
      //solution = currentSolution; 
      System.out.println("SOLUTION REVERTED: " + improve.get(0)); 

      //do the flipping bits 

      if (toFlip == 1) 
       solution.set(pointer, 0); 
      else 
       solution.set(pointer, 1); 

      System.out.println("New Solution After flip: " + solution); 
     } 

    } 

} 

//generate initial solution(bits) randomly 
public static ArrayList<Integer> initialSolution(int length){ 
    Random r = new Random(); 
    ArrayList<Integer> solution = new ArrayList<Integer>(length); 

    // generate some random boolean values 
    boolean[] booleans = new boolean[length]; 
    for (int i = 0; i < booleans.length; i++) { 
     booleans[i] = r.nextBoolean(); 
    } 

    for (boolean b : booleans) { 
     if (b == true){ 
      solution.add(1); 
     } 
     else{ 
      solution.add(0); 
     } 
    } 

    return solution; 

} 

public static ArrayList<Integer> randomFlipOrder(int length){ 
    ArrayList<Integer> order = new ArrayList<Integer>(); 
    Random r = new Random(); 

    for (int i = 0; i < length; i++){ 
     order.add(i); 
    } 

    Collections.shuffle(order); 

    return order; 
    } 
    } 

'

имеет генерировать случайную битовую строку.
Например: [0,1,0] означает Пункт 2 принимается и дать общий вес = 10.

Таким образом, если общий вес < = емкость затем сохранить [0,1,0] на ArrayList.

Затем мне нужно перевернуть бит с индексом 2 (на основе Orderlist):
Например: [0,1,1] означает Пункт 2 & 3 принимаются и дают общий вес = 15.

Я хотел бы, чтобы вернуть предыдущее значение, сохраненное [0,1,0] и работа от предыдущего значения:
[0,1,0] => следующий бит будет флип с индексом 0 и bcomes [1,1,0] вместо того, чтобы принимать самую последнюю (превышенную емкость) [0,1,1] и переворачивать ее [1,1,1].

Но я продолжаю получать обновленное значение и не могу получить предыдущее значение при превышении емкости.

Мой выход: Output Image

+3

Вы действительно должны задать вопрос * в теле вопроса *, а не только в названии ... и, пожалуйста, уменьшить ваш вопрос к [mcve]. Пока неясно, что вы спрашиваете на данный момент, но если вы хотите узнать старое значение, вызовите 'get()' перед тем, как вы вызовете 'set()' ... –

ответ

0

Как получить предыдущее значение ArrayList после .set) используется (?

Вы не можете, если у вас нет резервной копии списка с помощью new ArrayList<Integer>(myListToBackup)

+0

, какая часть мне нужна для резервного копирования на основе моего код? – Ina

+0

Вы создаете резервную копию, прежде чем делать флип, а затем, если вы хотите ее вернуть, вы берете эту резервную копию –

+0

ok попробует ее. Спасибо :) – Ina

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