#java #python-2.7 #linked-list #code-conversion #flatmap
#java #python-2.7 #связанный список #код-преобразование #flatmap
Вопрос:
Я работаю над формулировкой проблемы транспортировки с помощью линейного программирования. Сначала я искал его в Интернете и нашел код, написанный на Java. Но мне приходится писать весь материал на Python. И я конвертирую его в Python. Я не утверждаю, что хорошо разбираюсь в Java, нет, в Python. Я попытался немного преобразовать. Все в порядке, но я не знаю, как преобразовать приведенный ниже фрагмент, он касается LinkedLists и потоковых функций Java.
static LinkedList<Shipment> matrixToList() {
return stream(matrix)
.flatMap(row -> stream(row))
.filter(s -> s != null)
.collect(toCollection(LinkedList::new));
}
Если вам интересно узнать, как я преобразовал приведенный выше связанный Java-код, здесь вы можете увидеть Shipment
, что приведенный ниже класс является моим (неполным) Код Python:
import sys
class TransportationProblem:
demand = list()
supply = list()
costs = list(list())
matrix = list(list())
def __init__(self):
pass
class Shipment:
costPerUnit = 0.0
quantity = 0.0
r = 0
c = 0
def __init__(self, quantity, costPerUnit, r, c):
self.quantity = quantity
self.costPerUnit = costPerUnit
self.r = r
self.c = c
def init(self, f_name= ""):
try:
with open(f_name) as f:
val = [int(x) for x in f.readline().strip().split(' ')]
numSources, numDestinations = val[0], val[1]
src = list()
dst = list()
val = [int(x) for x in f.readline().strip().split(' ')]
for i in range(0,numSources):
src.append(val[i])
val = [int(x) for x in f.readline().strip().split(' ')]
for i in range(0, numDestinations):
dst.append(val[i])
totalSrc = sum(src)
totalDst = sum(dst)
if totalSrc > totalDst:
dst.append(totalSrc - totalDst)
elif totalDst > totalSrc:
src.append(totalDst - totalSrc)
self.supply = src
self.demand = dst
self.costs = [[0 for j in range(len(dst))] for i in range(len(src))]
self.matrix = [[self.Shipment() for j in range(len(dst))] for i in range(len(src))]
for i in range(0,len(src)):
val = [int(x) for x in f.readline().strip().split(' ')]
for j in range(0, len(dst)):
self.costs[i][j] = val[j]
print self.costs
except IOError:
print "Error: can't find file or read data"
def northWestCornerRule(self):
northwest = 0
for r in range(0, len(self.supply)):
for c in range(northwest, len(self.demand)):
quantity = min(self.supply[r], self.demand[c])
if quantity > 0:
self.matrix[r][c] = self.Shipment(quantity=quantity, costPerUnit=self.costs[r][c], r=r, c=c)
self.supply[r] = self.supply[r] - quantity
self.demand[c] = self.demand[c] - quantity
if self.supply[r] == 0:
northwest = c
break
def steppingStone(self):
maxReduction = 0
move = []
leaving = self.Shipment()
self.fixDegenerateCase()
for r in range(0,len(self.supply)):
for c in range(0,len(self.demand)):
if self.matrix[r][c] != None:
pass
trail = self.Shipment(quantity=0, costPerUnit=self.costs[r][c], r=r, c=c)
path = self.geClosedPath(trail)
reduction = 0
lowestQuantity = sys.maxint
leavingCandidate = None
plus = True
for s in path:
if plus == True:
reduction = reduction s.costPerUnit
else:
reduction = reduction - s.costPerUnit
if s.quantity < lowestQuantity:
leavingCandidate = s
lowestQuantity = s.quantity
plus = not plus
if reduction < maxReduction:
move = path
leaving = leavingCandidate
maxReduction = reduction
if move != None:
q = leaving.quantity
plus = True
for s in move:
s.quantity = s.quantity q if plus else s.quantity - q
self.matrix[s.r][s.c] = None if s.quantity == 0 else s
plus = not plus
self.steppingStone()
def fixDegenerateCase(self):
pass
def getClosedPath(self):
pass
def matrixToList(self):
pass
Ответ №1:
Мы можем разбить это на шаги. Вы начинаете с matrix
переменной, которая представляет собой некоторую итерацию, содержащую итерации типа Shipment
.
Поток объекта означает, что вы выполняете действие над каждым элементом потока.
A map
в потоке означает, что вы берете каждый объект, скажем, типа A
, и преобразуете его в некоторый тип B
. A flatMap
— это особый случай, используемый, когда a map
будет производить Stream<B>
. flatMap
позволяет объединить эти потоки в один поток.
Скажем, каждый A
сопоставляет поток из 3 объектов {A1, A2} -> {{B11, B12, B13}, {B21, B22, B23}}
flatMap
сделает этот поток одним {A1, A2} -> {B11, B12, B13, B21, B22, B23}
В этом случае a matrix
создает поток row
объектов. Каждый row
из них отображается в поток Shipment
и flatMap
используется для их объединения.
Finally filter
используется для удаления пустых отправлений (т.Е. Значение равно нулю), и collect
метод вызывается для преобразования потока Shipment
в a List
.
Воссоздание этого без потоков может выглядеть следующим образом:
static LinkedList<Shipment> matrixToList() {
LinkedList<Shipment> result = new LinkedList<>();
for (List<Shipment> row : matrix) {
for (Shipment shipment : row) {
if (shipment != null) {
result.add(shipment );
}
}
}
return resu<
}