Java 如何在给定相应用户输入的CSV文件中搜索特定字段?

Java 如何在给定相应用户输入的CSV文件中搜索特定字段?,java,csv,arraylist,Java,Csv,Arraylist,创建一个类,作为每个电视节目的父类 类型:家庭、喜剧、黑暗、神秘、其他 每种类型的电视节目都应从父类继承。确定 父级中存在哪些数据和方法,以及每个父级中存在哪些数据和方法 每个子类应该有两个构造函数。大体上 节目,将所有电视节目存储在一个阵列中一段时间 循环询问用户他们想问什么问题 回答与电视节目相关的问题。使用ArrayList 回答问题。向用户提供显示的功能 所有的电视节目和相应的数据 到目前为止,我已经为每种类型的节目编写了一个超类和子类,并将电视节目存储在一个数组列表中。我对其他一切都一

创建一个类,作为每个电视节目的父类 类型:家庭、喜剧、黑暗、神秘、其他

每种类型的电视节目都应从父类继承。确定 父级中存在哪些数据和方法,以及每个父级中存在哪些数据和方法 每个子类应该有两个构造函数。大体上 节目,将所有电视节目存储在一个阵列中一段时间 循环询问用户他们想问什么问题 回答与电视节目相关的问题。使用ArrayList 回答问题。向用户提供显示的功能 所有的电视节目和相应的数据

到目前为止,我已经为每种类型的节目编写了一个超类和子类,并将电视节目存储在一个数组列表中。我对其他一切都一窍不通

tvShowData.csv的示例:

标题、观众、网络、演员1、演员2、演员3、演员4、电视节目类型
行尸走肉,11.24,AMC,诺曼·里德斯,安德鲁·林肯,劳伦·科汉,史蒂文·杨,黑暗
少年狼,3.02,MTV,迪伦·奥布莱恩,泰勒·波西,荷兰,罗登,泰勒·霍奇林,黑暗
扫描仪键盘=新扫描仪(System.in);
字符串文件=“tvshowData.csv”;
List tvShows=new ArrayList();
弦线;
字符串用户输入;
try(BufferedReader br=new BufferedReader(new FileReader(file))){
而((line=br.readLine())!=null){
字符串[]显示=line.split(“,”);
添加(Arrays.asList(shows));
}
System.out.println(电视节目);
}
System.out.println(“输入您想要了解的电视节目:”;
userInput=keyboard.nextLine();
//超类
公共类电视节目
{
私有字符串标题;
私人双观众;
专用字符串网络;
私有字符串actor1、actor2、actor3、actor4;
公共电视节目(字符串标题、双观众、字符串网络)
{
this.title=标题;
这个。观众=观众;
这个网络=网络;
}
公共电视节目(字符串actor1、字符串actor2、字符串actor3、字符串actor4)
{
this.actor1=actor1;
this.actor2=actor2;
this.actor3=actor3;
this.actor4=actor4;
}
公共字符串getTitle()
{
返回标题;
}
公共双访问对象()
{
回访观众;
}
公共字符串网络()
{
返回网络;
}
公共字符串getActor1()
{
返回Actor 1;
}
公共字符串getActor2()
{
返回Actor 2;
}
公共字符串getActor3()
{
返回actor3;
}
公共字符串getActor4()
{
返回actor4;
}
}
//子类
公共类黑暗电视节目
{
私有字符串类型;
公共黑暗(显示的字符串名称、双观众、字符串网络)
{
超级(展会名称、观众、网络);
}
公共暗(字符串actor1、字符串actor2、字符串actor3、字符串actor4)
{
超级(actor1、actor2、actor3、actor4);
}
公共无效设置tvShowType(字符串tvShowType)
{
this.tvShowType=tvShowType;
}
公共字符串getTvShowType()
{
返回tvShowType;
}
}

主要是你可以使用类似的东西,但你必须适应你的输入。
匹配基于使用各种
谓词

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.function.Predicate;
import java.util.stream.Collectors;

public class Test {

    public static void main(String[] args) {

        test();
    }

    public static void test() {
        //prepare data, here is just something for test 
        List<String> lst1 = Arrays.asList("A", "B", "C", "B", "B");
        List<String> lst2 = Arrays.asList("A", "D", "E");
        ShowData sd1 = new Test().new ShowData("show1", lst1);
        ShowData sd2 = new Test().new ShowData("show2", lst2);
        // System.out.println(sd1);
        ShowList<ShowData> sl = new Test().new ShowList<ShowData>();
        sl.add(sd1);
        sl.add(sd2);

        //write searching criteria
        Predicate<String> pactorA = t -> t.equals("A");
        Predicate<ShowData> haveActorA = t -> t.actors.stream().filter(pactorA).count() > 0;
        System.out.println("[Count Lines for Actor A]=" + sl.stream().filter(haveActorA).count());
        //use criteria and print any matching-lines
        sl.stream().filter(haveActorA).forEach(System.out::println);

        //same as above but with other criteria[another actor]
        Predicate<String> pactorB = t -> t.equals("B");
        Predicate<ShowData> haveActorB = t -> t.actors.stream().filter(pactorB).count() > 0;
        System.out.println("[Count Lines for Actor B]=" + sl.stream().filter(haveActorB).count());
        sl.stream().filter(haveActorB).forEach(System.out::println);

        Predicate<String> pactorF = t -> t.equals("F");
        Predicate<ShowData> haveActorF = t -> t.actors.stream().filter(pactorF).count() > 0;
        System.out.println("[Count Lines for Actor F]=" + sl.stream().filter(haveActorF).count());
        sl.stream().filter(haveActorF).forEach(System.out::println);

    }

    @SuppressWarnings("hiding")
    class ShowList<ShowData> extends ArrayList<ShowData> {
        private static final long serialVersionUID = 1L;

    }

    class ShowData {
        String name;
        List<String> actors = new ArrayList<>();

        public ShowData(String name, List<String> actor) {
            this.name = name;
            this.actors.addAll(actor);
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public List<String> getActors() {
            return actors;
        }

        public void setActors(List<String> actors) {
            this.actors = actors;
        }

        public String toString() {
            return "name=" + name + " and actors=[" + actors.stream().collect(Collectors.joining(",")) + "]";
        }

    }

}

用户可以询问有关某个节目的具体细节,例如该节目首播的网络或演员的姓名。“如何搜索特定字段”的简短回答是使用循环扫描数组,检查字符串是否匹配
if(showString.equals(inputString)){…}
或包含输入
if(showString.contains(inputString)){…}
。Abra提到的更好的答案是创建一个自定义类/对象来存储数据,以便您可以更轻松地管理数据。@Abra我已经为每个电视节目类型创建了一个TvShow超类和子类。我还按照提示中的指定将电视节目存储在数组列表中。我一直在考虑如何接受用户输入电视节目和用户希望了解并显示该节目的特定详细信息。一个提示,主要是您应该有一个包含所有字段的构造函数,因为它用于获取一个填充了所有字段的实例,使用您的构造函数实例只是部分填充了数据(参与者或其他一些字段)。假设使用填充参与者的构造函数,那么在创建对象后,您应该手动添加标题。似乎有很多额外的工作(假设您知道您无法应用相同的object 2构造函数)。此外,这里的专门化有点多余,只需在超类上添加一个额外的字段(可能是enum:dark等)另一个提示是,对于参与者,您可以仅在csv末尾添加所有参与者,您可以取消强制添加4个参与者的限制。在添加参与者之前,所有字段都是必需的,并且知道参与者开始的位置。使用该字段可以获得参与者列表(假设一个节目可以有30个演员,所以你必须编写30个文件和constructor+30个参数。非常详细)。
演员列表可以容纳你想要的数量或更少,只需查看演员提供的代码即可。
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.function.Predicate;
import java.util.stream.Collectors;

public class Test {

    public static void main(String[] args) {

        test();
    }

    public static void test() {
        //prepare data, here is just something for test 
        List<String> lst1 = Arrays.asList("A", "B", "C", "B", "B");
        List<String> lst2 = Arrays.asList("A", "D", "E");
        ShowData sd1 = new Test().new ShowData("show1", lst1);
        ShowData sd2 = new Test().new ShowData("show2", lst2);
        // System.out.println(sd1);
        ShowList<ShowData> sl = new Test().new ShowList<ShowData>();
        sl.add(sd1);
        sl.add(sd2);

        //write searching criteria
        Predicate<String> pactorA = t -> t.equals("A");
        Predicate<ShowData> haveActorA = t -> t.actors.stream().filter(pactorA).count() > 0;
        System.out.println("[Count Lines for Actor A]=" + sl.stream().filter(haveActorA).count());
        //use criteria and print any matching-lines
        sl.stream().filter(haveActorA).forEach(System.out::println);

        //same as above but with other criteria[another actor]
        Predicate<String> pactorB = t -> t.equals("B");
        Predicate<ShowData> haveActorB = t -> t.actors.stream().filter(pactorB).count() > 0;
        System.out.println("[Count Lines for Actor B]=" + sl.stream().filter(haveActorB).count());
        sl.stream().filter(haveActorB).forEach(System.out::println);

        Predicate<String> pactorF = t -> t.equals("F");
        Predicate<ShowData> haveActorF = t -> t.actors.stream().filter(pactorF).count() > 0;
        System.out.println("[Count Lines for Actor F]=" + sl.stream().filter(haveActorF).count());
        sl.stream().filter(haveActorF).forEach(System.out::println);

    }

    @SuppressWarnings("hiding")
    class ShowList<ShowData> extends ArrayList<ShowData> {
        private static final long serialVersionUID = 1L;

    }

    class ShowData {
        String name;
        List<String> actors = new ArrayList<>();

        public ShowData(String name, List<String> actor) {
            this.name = name;
            this.actors.addAll(actor);
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public List<String> getActors() {
            return actors;
        }

        public void setActors(List<String> actors) {
            this.actors = actors;
        }

        public String toString() {
            return "name=" + name + " and actors=[" + actors.stream().collect(Collectors.joining(",")) + "]";
        }

    }

}
[Count Lines for Actor A]=2
name=show1 and actors=[A,B,C,B,B]
name=show2 and actors=[A,D,E]

[Count Lines for Actor B]=1
name=show1 and actors=[A,B,C,B,B]

[Count Lines for Actor F]=0