Как выполнять операции в двух коллекциях одинакового размера - PullRequest
0 голосов
/ 29 октября 2018

Предполагая, что существует два целочисленных массива ArrayList одинакового размера, есть ли более эффективный способ вернуть список, составленный из разницы между двумя списками?
Мое решение очень простое, но, кажется, не очень хорошее, просто опубликуйте его:

// Assuming two same size list
List<Integer> listA = Arrays.asList(91,81,76,66,52);
List<Integer> listB = Arrays.asList(11,24,36,40,53);
List<Integer> diffList = new ArrayList<Integer>();
// I expect to get [80, 57, 40, 26, -1] back
for(int i = 0 ; i < listA.size(); i++){
    diffList.add(listA.get(i)-listB.get(i));
}

Но я подумал, что это не очень хорошее решение. У кого-нибудь есть идея лучше решить этот вопрос с помощью Java 8 Stream или какой-то другой структуры данных?

Ответы [ 2 ]

0 голосов
/ 29 октября 2018

Спасибо за помощь @nullpointer, у меня есть идея, если размер списка не эквивалентен.

    boolean isALonger;
    if (listA.size() > listB.size()) {
        isALonger = true;
    } else {
        isALonger = false;
    }
    List<Integer> integers = IntStream.range(0, isALonger?listA.size():listB.size()).mapToObj(i -> {
        if (isALonger) {
            if (i < listB.size()) {
                return listA.get(i) - listB.get(i);
            } else {
                return listA.get(i);
            }
        } else {
            if (i < listA.size()) {
                return listA.get(i) - listB.get(i);
            } else {
                return - listB.get(i);
            }
        }
    }).collect(Collectors.toList());  

Спасибо за советы Хольгера. Я исправил код ниже:

    int minSize = Math.min(listA.size(), listB.size());
    int maxSize = Math.max(listA.size(), listB.size());
    Stream<Integer> diffPart = IntStream.range(0, minSize).mapToObj(i -> listA.get(i) - listB.get(i));
    Stream<Integer> restPart = IntStream.range(minSize, maxSize).mapToObj(i -> listA.size() > listB.size() ? listA.get(i) :
            -listB.get(i));
    List<Integer> collect = Stream.concat(diffPart, restPart).collect(Collectors.toList());
0 голосов
/ 29 октября 2018

Поскольку вопрос помечен , отсюда и предложение, которое вы можете использовать:

List<Integer> diffList = IntStream.range(0, listA.size())
        .mapToObj(i -> listA.get(i) - listB.get(i))
        .collect(Collectors.toList());
...