новый Java Список объектов путем сопоставления записей в двух других списках

По моему опыту, вам нужно убедиться в двух вещах: 1) И Python, и Pygame должны быть 32 бит - ни один, ни оба из них не являются 64-битными. 2) Оба Python и Pygame должны быть совместимы для одной и той же версии.

Возможно, вы сможете запустить 64-разрядную версию, но не все пакеты перешли на 64 бит, а небольшое улучшение производительности - т стоит разочарование, пытаясь заставить его работать. Я также нашел, что последний 32-разрядный Pygame (по состоянию на 5 февраля 2016 года), похоже, хорошо работает с 32-разрядным Python 3.4.4. Я установил 32-разрядный python-3.4.4.msi в Windows 10 из папки моих загрузок в папку C: \ Python34. В папке Python34 я создал папку под названием «Каталог проектов». В нем я разместил «pygame-1.9.2a0-hg_ea3b3bb8714a.win32-py3.4.msi», который, я думаю, получил из https://bitbucket.org/pygame/pygame/downloads . Дважды щелкните по нему. Работал в первый раз. Я также установил «Microsoft Visual Studio Community 2015 с обновлением 1.» Не знаю, помогло ли это решить проблему, но этот пакет MVSC устанавливает множество DLL. Для получения MVSC требуется довольно много времени. Но теперь у меня Pygame работает на Windows 10.

3
задан Mureinik 13 July 2018 в 19:00
поделиться

4 ответа

Решение YCF_L должно работать, но это решение O (n2). Решение O (n) может быть достигнуто путем преобразования одного списка в карту с идентификатора на объект, а затем итерации по другому и получения соответствующего значения с карты:

Map<Integer, Person> personMap = 
    persons.stream().collect(Collectors.toMap(Person::getId, Function.identity());

List<PersonWithMetadata> result = 
    metadata.stream()
            .map(m -> new PersonWithMetadata(personMap.get(m.getId()), m)
            .collect(Collectors.toList());

В образце данных, списки имеют соответствующие объекты в порядке совпадения. Если это предположение верно и для реальной проблемы, решение может быть проще: вы можете передавать индексы и получать соответствующие значения из списков:

List<PersonWithMetadata> result = 
    IntStream.reange(0, persons.size())
             .map(i -> new PersonWithMetadata(persons.get(i), metadata.get(i))
             .collect(Collectors.toList());
5
ответ дан Mureinik 17 August 2018 в 12:15
поделиться

В приведенном ниже примере создается Map объектов Metadata с использованием идентификатора в качестве ключа. Это поможет в производительности, так как нет необходимости перебирать список Metadata для каждого Person в List

Код

public static void main(String[] args) {
    List<Person> persons = Arrays.asList(
            new Person(1, "Mike", "Canada"),
            new Person(2, "Jill", "England"),
            new Person(3, "Will", "Whales"),
            new Person(4, "Mary", "Spain"));


    List<Metadata> metadataList = Arrays.asList(
            new Metadata(1, "2000-01-01", "Naturalized", "Bachelor's of Arts"),
            new Metadata(2, "2001-01-01", "ExPat", "Masters of Chemestry"),
            new Metadata(3, "2017-05-01", "Citizen", "Buiness Management"),
            new Metadata(4, "2018-04-16", "Work Visa", "Nursing"));

    //Iterate over metadataList once and create map based on ID as key
    Map<Integer, List<Metadata>> metadataMap = metadataList.stream()
            .collect(Collectors.groupingBy(Metadata::getId));

    //Iterate over personList and fetch metadata from Map to build PersonWithMetadata
    List<PersonWithMetadata> personWithMetadataList = persons.stream().map(person -> {
        List<Metadata> metadata = metadataMap.get(person.id);
        if (metadata.isEmpty()) {
            //TODO: Handle scenario for no metadata for person
        }

        //TODO: Build PersonWithMetadata

        return new PersonWithMetadata();

    }).collect(Collectors.toList());

}
1
ответ дан Garreth Golding 17 August 2018 в 12:15
поделиться

Я считаю, что вы ищете функцию zip, которая была опечалена в API.

Это библиотека protonpack предоставляет ее, что позволит вам zip и затем сопоставить кортеж с новой структурой.

StreamUtils.zip(persons, metadata, (person, metadata) -> ... )
1
ответ дан Kraylog 17 August 2018 в 12:15
поделиться

Вы можете попробовать следующим образом:

List<PersonWithMetadata> personsAndMEtadata = persons.stream()
        .map(p -> {
                    //search for the meta data based on the person id
                    Metadata meta = metadata.stream()
                            .filter(m -> m.getId() == p.getId())
                            .findFirst()
                            .get();
                    // then create a PersonWithMetadata object based on Person and metadata
                    return new PersonWithMetadata(
                            p.getId(), p.getFirstName(), p.getLastName(),
                            meta.getDate(), meta.getCity(), meta.getJob()
                    );

                }
        ).collect(Collectors.toList());

Об этой строке:

Metadata meta = metadata.stream().filter(m -> m.getId() == p.getId()).findFirst().get();

Предполагаю, что у вас есть метаданные с идентификатором человека, иначе вы получите NullPointerException.

3
ответ дан YCF_L 17 August 2018 в 12:15
поделиться
  • 1
    Чтобы что-то сказать, это решение O (n ^ 2), тогда как проблема легко разрешима в O (n) без использования потоков ... – Obicere 13 July 2018 в 18:56
  • 2
    Его можно решить в O (n), используя потоки. – Kraylog 13 July 2018 в 18:57
  • 3
    @ Obicere проверить ответ Mureinik, вы можете решить его в O (n) – YCF_L 13 July 2018 в 18:58
  • 4
    @Obicere рядом с ним не полностью O (n ^ 2) , если два списка являются порядками по id, как было показано, поэтому он всегда будет выбирать первый элемент и разбивать – YCF_L 13 July 2018 в 19:13
  • 5
    Его ничего личного, но это причина, по которой многим людям не нравятся потоки. Многим разработчикам нравится писать быстрый код, и в этом случае вы первым ответили. Написание кода быстро - это хорошо, но не тогда, когда вы жертвуете эффективностью. В целом этот ответ способствует этому "сделайте это" отношения с потоками, которые, я считаю, оправдывают нисходящий поток, поскольку это плохой ответ на вопрос. А также, он все еще O (n ^ 2), даже если он находит его примерно в половине случаев. – Obicere 13 July 2018 в 19:24
Другие вопросы по тегам:

Похожие вопросы: