private void readMachineList() throws IOException { int machineListSize = readIntegerValue(); List<MrNeighborhood> neighborhoodList = new ArrayList<>(machineListSize); Map<Long, MrNeighborhood> idToNeighborhoodMap = new HashMap<>(machineListSize); List<MrLocation> locationList = new ArrayList<>(machineListSize); Map<Long, MrLocation> idToLocationMap = new HashMap<>(machineListSize); machineList = new ArrayList<>(machineListSize); long machineId = 0L; List<MrMachineCapacity> machineCapacityList = new ArrayList<>(machineListSize * resourceListSize); long machineCapacityId = 0L; // 2 phases because service dependencies are not in low to high order for (int i = 0; i < machineListSize; i++) { MrMachine machine = new MrMachine(); machine.setId(machineId); machineList.add(machine); machineId++; } for (int i = 0; i < machineListSize; i++) { MrMachine machine = machineList.get(i); String line = readStringValue(); int moveCostOffset = 2 + (resourceListSize * 2); String[] lineTokens = splitBySpace(line, moveCostOffset + machineListSize); long neighborhoodId = Long.parseLong(lineTokens[0]); MrNeighborhood neighborhood = idToNeighborhoodMap.get(neighborhoodId); if (neighborhood == null) { neighborhood = new MrNeighborhood(); neighborhood.setId(neighborhoodId); neighborhoodList.add(neighborhood); idToNeighborhoodMap.put(neighborhoodId, neighborhood); } machine.setNeighborhood(neighborhood); long locationId = Long.parseLong(lineTokens[1]); MrLocation location = idToLocationMap.get(locationId); if (location == null) { location = new MrLocation(); location.setId(locationId); locationList.add(location); idToLocationMap.put(locationId, location); } machine.setLocation(location); List<MrMachineCapacity> machineCapacityListOfMachine = new ArrayList<>(resourceListSize); for (int j = 0; j < resourceListSize; j++) { MrMachineCapacity machineCapacity = new MrMachineCapacity(); machineCapacity.setId(machineCapacityId); machineCapacity.setMachine(machine); machineCapacity.setResource(resourceList.get(j)); machineCapacity.setMaximumCapacity(Long.parseLong(lineTokens[2 + j])); machineCapacity.setSafetyCapacity(Long.parseLong(lineTokens[2 + resourceListSize + j])); machineCapacityList.add(machineCapacity); machineCapacityListOfMachine.add(machineCapacity); machineCapacityId++; } machine.setMachineCapacityList(machineCapacityListOfMachine); Map<MrMachine, Integer> machineMoveCostMap = new HashMap<>(machineListSize); for (int j = 0; j < machineListSize; j++) { MrMachine toMachine = machineList.get(j); int moveCost = Integer.parseInt(lineTokens[moveCostOffset + j]); machineMoveCostMap.put(toMachine, moveCost); } machine.setMachineMoveCostMap(machineMoveCostMap); } machineReassignment.setNeighborhoodList(neighborhoodList); machineReassignment.setLocationList(locationList); machineReassignment.setMachineList(machineList); machineReassignment.setMachineCapacityList(machineCapacityList); }