Почему мой поток фильтра возвращает все объекты с «одинаковым» именем элемента? - PullRequest
0 голосов
/ 09 июля 2020

Мои объекты находятся в списке, и моя цель - изменить элементы внутри объекта. Для начала я ищу элемент имени внутри объекта, чтобы определить, какой объект я хотел бы изменить, а затем go вперед и изменяю его. Проблема в том, что у меня есть 3 объекта с названием «Гарри Поттер». Это выглядит примерно так:

  1. Гарри Поттер
  2. Гарри Поттер 1 ( Переименовано в - Гарри Поттер и Кубок огня )
  3. Гарри Поттер 2 ( Переименовано в - Гарри Поттер и Тайная комната )

После того, как я ищу объект с именем элемента «Гарри Поттер», он возвращает все 3 объекта, но Я сбит с толку, так как думал, что он вернет именно объект с именем элемента «Гарри Поттер», а не все остальное. Он работает, если я ввожу имя, в котором есть только один существующий объект с этим именем элемента, но кажется, что если есть несколько объектов с хотя бы упоминанием того же имени, он также вернет эти объекты, поскольку, как вы видели, я переименовал те два других фильма с более конкретным именем c, и он по-прежнему возвращает все

  1. Почему это происходит?
  2. После того, как первая проблема решена, как я могу тогда go вперед и позвольте пользователю ввести значения для всех элементов в объекте, чтобы изменить существующие значения этих элементов

Основной класс

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Unmarshaller;
import java.io.File;
import java.io.IOException;
import java.util.List;
import java.util.Optional;
import java.util.Scanner;
import java.util.stream.Collectors;

public class Main {
    public static void main(String[] args) throws IOException, JAXBException {

        File file = new File("items.xml");
        Scanner scan = new Scanner(System.in);

        JAXBContext context = JAXBContext.newInstance(Items.class);
        Unmarshaller un = context.createUnmarshaller();
        Items itemData = (Items) un.unmarshal(file);

        List<Item> items = itemData.getItem();

        for(Item e: items){
            System.out.println("\nDataType : "+e.getDataType());
            System.out.println("Name : "+e.getName());
            System.out.println("Data : "+e.getData());
            System.out.println("Group : "+e.getGroup());
            System.out.println("Sub Categories : " + e.getItems());
            System.out.println("--------------------------");
        }

        System.out.println("'\n\n------------- Options ---------------");
        System.out.println("\n1. Search Items by Group");
        System.out.println("\n2. Modify Movie");
        int choice = scan.nextInt();
        scan.nextLine();

        if(choice == 1){
            System.out.println("\nEnter the group name you're searching for: ");
            String search = scan.nextLine();

            List<Item> filteredByGroup = items.stream()
                    .filter(i ->i.getGroup().equals(search))
                    .collect(Collectors.toList());

            filteredByGroup.forEach(System.out::println);

        }
        else if (choice == 2){
            System.out.println("\nEnter the name of the movie you would like to modify: ");
            String search = scan.nextLine();

            Optional<Item> item = items.stream()
                    .filter(x -> x.getName().equals(search))
                    .findFirst();

            System.out.println(item.toString());

        }

        else{
            System.out.println("You entered an invalid option!");
        }
    }
}

Класс элемента

import javax.xml.bind.annotation.XmlElement;

public class Item {
    private String dataType;
    private String name;
    private int data;
    private String group;
    private Items items;

    @XmlElement
    public String getDataType(){
        return dataType;
    }
    public void setDataType(String dataType){
        this.dataType = dataType;
    }

    @XmlElement
    public String getName(){
        return name;
    }
    public void setName(String name){
        this.name = name;
    }

    @XmlElement
    public int getData(){
        return data;
    }
    public void setData(int data){
        this.data = data;
    }

    @XmlElement
    public String getGroup(){
        return group;
    }
    public void setGroup(String group){
        this.group = group;
    }

    public Items getItems() {
        return items;
    }

    public void setItems(Items items) {
        this.items = items;
    }

    @Override
    public String toString() {
        return
                "\n\tDataType: " + dataType +
                "\n\tName: " + name +
                "\n\tData: " + data +
                "\n\tGroup: " + group +
                "\n\tItems: " + items + "\n";
    }
}

Класс товаров

import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import java.util.List;

@XmlRootElement(name = "items")
public class Items {
    private List<Item> item;

    @XmlElement(name = "item")
    public List<Item> getItem(){
        return item;
    }

    public void setItem(List<Item> itemList){
        this.item = itemList;
    }

    @Override
    public String toString() {
        return "\n" + item ;
    }
}

XML Файл

<items> 
      <item>
            <dataType>Number</dataType>
            <name>Rush Hour</name>
            <data>1</data>
            <group>Comedy</group>
      </item>
      <item>
            <dataType>Number</dataType>
            <name>Harry Potter</name>
            <data>2</data>
            <group>Fiction</group>
            <items>
                  <item>
                        <dataType>Number</dataType>
                        <name>Harry Potter and the Goblet Of Fire</name>
                        <data>3</data>
                        <group>Fiction</group>
                  </item>
                  <item>
                        <dataType>Number</dataType>
                        <name>Harry Potter and the Chamber of secrets</name>
                        <data>4</data>
                        <group>Fiction</group>
                  </item>
            </items>
      </item>
      <item>
            <dataType>Number</dataType>
            <name>Men In Black</name>
            <data>5</data>
            <group>Action</group>
      </item>
      <item>
            <dataType>Number</dataType>
            <name>Coming to America</name>
            <data>6</data>
            <group>Comedy</group>
      </item>
</items>

1 Ответ

0 голосов
/ 09 июля 2020

Опубликованный вами код работает правильно. Возвращен только один объект с именем «Гарри Поттер» со всеми его подпунктами «Гарри Поттер 1» и «Гарри Поттер 2». Вы, вероятно, не заметили, что предметы «Гарри Поттер 1» и «Гарри Поттер 2» являются дочерними элементами предмета «Гарри Поттер». Подумайте об изменении вашего XML на следующее, и вы должны получить ожидаемое поведение:

<items> 
      <item>
            <dataType>Number</dataType>
            <name>Rush Hour</name>
            <data>1</data>
            <group>Comedy</group>
      </item>
      <item>
            <dataType>Number</dataType>
            <name>Harry Potter</name>
            <data>2</data>
            <group>Fiction</group>
      </item>
      <item>
            <dataType>Number</dataType>
            <name>Harry Potter and the Goblet Of Fire</name>
            <data>3</data>
            <group>Fiction</group>
      </item>
      <item>
            <dataType>Number</dataType>
            <name>Harry Potter and the Chamber of secrets</name>
            <data>4</data>
            <group>Fiction</group>
      </item>
      <item>
            <dataType>Number</dataType>
            <name>Men In Black</name>
            <data>5</data>
            <group>Action</group>
      </item>
</items>

Чтобы ответить на второй вопрос, после фильтрации элементов, которые будут изменены, вы должны использовать функцию map(), которая позволяет вам изменять все содержимое сохраненных объектов внутри потока, а затем собрать их, как вы это сделали в первом случае.

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