Сравните список пар с элементами пользовательского класса в Java - PullRequest
0 голосов
/ 17 февраля 2019

Итак, я пытаюсь решить эту проблему здесь:

У меня есть список пар:

    List<Tuple<Byte, Byte>> pairList

    pairList = ( [0,1], [0,2], [0,3], [1,2],[1,3],[2,3])

У меня есть собственный класс:

Class CustomPairList {
    byte first;
    byte second;
    int result;

    public byte getFirst();
    public byte getSecond();
    public int getResult();
}

У меня есть другой список вышеупомянутого класса, с этими данными:

List<CustomPairList> customPairlist;

customPairList = {[0,1,1000], [0,2,1000],[0,3,1000]......[0,10,1000],
                  [1,2,2000],[1,3,2000],[1,4,2000].......[1,10,2000],
                  [2,3,3000],[2,4,3000]..................[3,10,3000],
                  ''' 
                  ...
                  [14,1,4000].............................[14,10,4000]}

Моя цель из двух вышеупомянутых списков состояла бы в том, чтобы сравнить два списка и извлечь результат из customPairList (второй список) длязаданная пара.

Например:

Для пары в pairlist (0,1) должна совпадать пара в customPairList (0,1), а «результатом» будет 1000

Другой пример:

пара (1,2) в pairlist имеет совпадение в customPairList (1,2) и отображает соответствующее ему значение "результата" 2000

Как мне достичьэто?

Ответы [ 2 ]

0 голосов
/ 17 февраля 2019

Отфильтруйте customPairList, проверив, есть ли у каждого customPair в списке совпадение в pairList, получите результат отфильтрованного customPair и напечатайте его

customPairList.stream()
              .filter(customPair -> {
                         return pairList.stream()
                                        .filter(tuple -> { return tuple.getFirst().equals(customPair.getFirst()) && tuple.getSecond().equals(customPair.getSecond()); })
                                        .findFirst() != null;
                })
              .mapToInt(customPair -> { return customPair.getResult(); })
              .forEach(customPair -> { System.out.println(customPair.getResult()); });
0 голосов
/ 17 февраля 2019

Вам нужно, чтобы методы .equals и .hashCode были реализованы в классе Tuple.

Я удалил обобщения и заменил байты на значения ints для простоты:

class Tuple {
    Integer _1;
    Integer _2;

    Tuple(Integer _1, Integer _2) {
        this._1 = _1;
        this._2 = _2;
    }

    //...

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Tuple tuple = (Tuple) o;
        return (_1 == tuple._1) && (_2 == tuple._2);
    }

    @Override
    public int hashCode() {
        return Objects.hash(_1, _2);
    }
}

class CustomPairList {
    int first;
    int second;
    int result;

    CustomPairList(int first, int second, int result) {
        this.first = first;
        this.second = second;
        this.result = result;
    }

    public int getResult() {
        return result;
    }

    //...
}

Далее выможет изменить CustomPairList на простую карту:

public class Application {

static List<Tuple> pairList = new ArrayList<>();

static {
    pairList.add(new Tuple(0, 1));
    pairList.add(new Tuple(0, 2));
    pairList.add(new Tuple(0, 3));
    pairList.add(new Tuple(1, 2));
    pairList.add(new Tuple(1, 3));
    pairList.add(new Tuple(2, 3));
}

public static void main(String[] args) {
    Map<Tuple, Integer> customPairs = new HashMap<>();
    customPairs.put(new Tuple(0, 1), 1000);
    customPairs.put(new Tuple(0, 2), 1000);
    customPairs.put(new Tuple(2, 1), 3000);
    customPairs.put(new Tuple(4, 1), 4000);

    // To get one result
    System.out.println(customPairs.get(pairList.get(0)));
    System.out.println(customPairs.get(pairList.get(1)));
    System.out.println(customPairs.get(pairList.get(2)));

    // To get all results
    int[] results = customPairs
            .entrySet()
            .stream()
            .filter(entry -> pairList.contains(entry.getKey()))
            .mapToInt(Map.Entry::getValue)
            .toArray();

    for(int i: results) {
        System.out.println(i);
    }
}
}

}

Если вам нужно сравнить полный список, вы можете попробовать функциональный подход с вашей текущей реализацией:

public class Application {

    static List<Tuple> pairList = new ArrayList<>();

    static {
        pairList.add(new Tuple(0, 1));
        pairList.add(new Tuple(0, 2));
        pairList.add(new Tuple(0, 3));
        pairList.add(new Tuple(1, 2));
        pairList.add(new Tuple(1, 3));
        pairList.add(new Tuple(2, 3));
    }

    static boolean filterByMask(CustomPairList customPairList) {
        return pairList.contains(new Tuple(customPairList.first, customPairList.second));
    }

    public static void main(String[] args) {
        List<CustomPairList> customPairLists = new ArrayList<>();
        customPairLists.add(new CustomPairList(0, 1, 1000));
        customPairLists.add(new CustomPairList(0, 2, 1000));
        customPairLists.add(new CustomPairList(3, 1, 3000));
        customPairLists.add(new CustomPairList(4, 1, 4000));

        int[] results = customPairLists
                .stream()
                .filter(Application::filterByMask)
                .mapToInt(CustomPairList::getResult)
                .toArray();

        for(int i: results) {
            System.out.println(i);
        }
    }
}

Для получения дополнительной информации об API Java Stream см. Обработка данных с помощью потоков Java SE 8, часть 1 , например.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...