Java, Python — Как преобразовать Java flatMap в Python LinkedList

#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<
}