2016-08-07 3 views
2

Я хочу, чтобы прочитать файл, который имеет следующую информацию:Динамический список списков в Java

4 //no. of machines 
1,3,6,1 //timings for machine 1 
1,3,6,1 //timings for machine 2 
1,3,6,1 //timings for machine 3 
1,3,6,1 //timings for machine 4 
2,4,8,10 //cost for machine 1 
2,4,8,10 //cost for machine 2 
2,4,8,10 //cost for machine 3 
2,4,8,10 //cost for machine 4 

нет. временных матриц и массивов затрат зависит от нет. машин. Элемент в индексе «i» временного массива связан с одним и тем же индексом в массиве затрат. Например, время 1 для машины 1 берет на себя стоимость 2, а затраты времени 3 4. Может ли кто-нибудь спросить, какая структура данных будет идеальна для этого сценария и как я буду продолжать ее?

Заранее спасибо.

+0

'int data [N] [2] [4]' для данных N машин [n] [0] 'это тайминги для n,' data [n] [1] '- это затраты. – Learath2

ответ

3

Вы можете использовать Карту, чтобы определить взаимосвязь между timing и cost. В качестве альтернативы вы можете иметь класс TimeCost для соотношения затрат времени.

public class TimeCost{ 
    private Integer time; 
    private Integer cost; 
} 

public class Machine{ 
    // private Map<Integer,Integer> timeCost; //possible alternative 
    private List<TimeCost> timeCost; 
} 
+1

Карта - плохая идея, так как вы потеряете заказ, и вы не сможете хранить несколько записей за одинаковые сроки. Ваша альтернатива намного лучше. – greyfairer

+2

И для завершения вашего ответа, если вы читаете весь файл, вам нужен список машин. – greyfairer

+0

Сроки не уникальны, поэтому вы не можете их индексировать! – macias

2

Во-первых, вы, вероятно, следует использовать Pair, чтобы сохранить отношения между сроками и стоимостью:

class Pair { 
    int timing; 
    int cost; 
} 

Тогда, я предполагаю, что вы не получите информацию о том, как много частей времени/стоимости вы получите, так что вам придется использовать ArrayList для представления информации Компьютера:

class Machine { 
    ArrayList<Pair> timingAndCost; 
} 

Тогда, так как количество машин указано для вас, используйте массив фиксированного размера для хранения машины:

Machine[] machines = new Machine[numberOfMachines]; 

Если вы рассматриваете только хранение ArrayList с в массиве, например:

ArrayList<Pair>[] machines = new ArrayList<Pair>[numberOfMachines]; 

Это не работает, потому что Java Безразлично 't позволяет вам объявлять общий массив. Но если вы действительно не нравится иметь Machine класс, то вы можете просто использовать ArrayList для хранения ArrayList<Pair>:

ArrayList<ArrayList<Pair>> machines = new ArrayList<>(numberOfMachines); 
1
import java.util.ArrayList; 



class DaMachine { 
    private final int mMachineIndex; 
    private final int[] mTimings; 
    private final int[] mCosts; 

    public DaMachine(final int pMachineIndex, final int[] pTimings, final int[] pCosts) { 
     mMachineIndex = pMachineIndex; 
     mTimings = pTimings; 
     mCosts = pCosts; 
    } 

    @Override public String toString() { 
     final StringBuilder sb = new StringBuilder(); 
     for (int i = 0; i < mTimings.length; i++) { 
      sb.append(mTimings[i] + ":" + mCosts[i] + " "); 
     } 
     return "Machine [#" + mMachineIndex + ": " + sb + "]"; 
    } 
} 



class CrazyFile { 
    static public String CRAZY = "4 //no. of machines \r\n" + // 
      "1,3,6,1 //timings for machine 1\r\n" + // 
      "1,3,6,1 //timings for machine 2\r\n" + // 
      "1,3,6,1 //timings for machine 3\r\n" + // 
      "1,3,6,11 //timings for machine 4\r\n" + // 
      "2,4,8,10 //cost for machine 1\r\n" + // 
      "2,4,8,10 //cost for machine 2\r\n" + // 
      "2,4,8,10 //cost for machine 3\r\n" + // 
      "2,4,8,111 //cost for machine 4"; 
} 



public class ReadCrazyFile { 
    public static void main(final String[] args) { 
     final String[] lines = CrazyFile.CRAZY.replace("\r\n", "\n").replace("\r", "\n").split("\n"); 

     final int numberOfMachines = Integer.parseInt(cleanString(lines[0])); 
     final ArrayList<String> timingStrings = new ArrayList<>(numberOfMachines); 
     final ArrayList<String> costStrings = new ArrayList<>(numberOfMachines); 
     int offset = 1; 

     // add timings 
     for (int relIndex = 0; relIndex < numberOfMachines; relIndex++) { 
      timingStrings.add(cleanString(lines[offset + relIndex])); 
     } 
     offset += numberOfMachines; 

     // add costs 
     for (int relIndex = 0; relIndex < numberOfMachines; relIndex++) { 
      costStrings.add(cleanString(lines[offset + relIndex])); 
     } 
     offset += numberOfMachines; // not necessary unless used later 

     // convert into objects 
     final ArrayList<DaMachine> machines = new ArrayList<>(numberOfMachines); 
     for (int machineIndex = 0; machineIndex < timingStrings.size(); machineIndex++) { 
      final String timingString = timingStrings.get(machineIndex); 
      final String costsString = costStrings.get(machineIndex); 
      final int[] timings = convertToIntArr(timingString); 
      final int[] costs = convertToIntArr(costsString); 
      final DaMachine terminator = new DaMachine(machineIndex, timings, costs); 
      machines.add(terminator); 
     } 

     for (final DaMachine m : machines) { 
      System.out.println("" + m); 
     } 
    } 

    static private String cleanString(final String pString) { 
     return pString.split("//")[0].trim(); 
    } 

    static private int[] convertToIntArr(final String pTimingString) { 
     final String[] words = pTimingString.split(","); 
     final int[] ret = new int[words.length]; 
     for (int i = 0; i < words.length; i++) { 
      ret[i] = Integer.parseInt(words[i].trim()); 
     } 
     return ret; 
    } 
} 
1

Это структура, что вам нужно решить эту проблему.

ArrayList<ArrayList<Integer>> listOLists = new ArrayList<ArrayList<Integer>>(); 
ArrayList<Integer> list1= new ArrayList<Integer>(); 

list1.add(4); 
listOLists.add(list1) 

ArrayList<Integer> list2= new ArrayList<Integer>(); 
list2.add(1); 
list2.add(3); 
list2.add(6); 
list2.add(1); 
listOLists.add(list2); 

ArrayList<Integer> list3= new ArrayList<Integer>(); 
list3.add(1); 
list3.add(3); 
list3.add(6); 
list3.add(1); 
listOLists.add(list3); 

Как этот мудрый вы можете продолжить. Его просто грубая идея, пожалуйста, оптимизируйте этот код в соответствии с вашими потребностями.

+0

Значимые имена очень важны при программировании, list1, list2 - это ничего не говорит о том, что внутри ... Я понимаю, что это означает общую концепцию, хотя – macias

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