【问题标题】:How do I search for a specific field in a CSV file given a corresponding user input? [closed]给定相应的用户输入,如何在 CSV 文件中搜索特定字段? [关闭]
【发布时间】:2021-04-22 01:16:26
【问题描述】:

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

每种类型的电视节目都应继承自该父类。确定 Parent中存在哪些数据和方法以及每个中存在什么 child 每个子类应该有两个构造函数。在主() 程序,将所有电视节目存储在一个 ArrayList 中使用一段时间 循环询问用户他们想问什么节目 回答与电视节目有关的问题。使用 ArrayList 来 回答问题。为用户提供显示能力 所有电视节目和相应的数据。

到目前为止,我已经设法为每种类型的节目编写了一个超类和子类,并将电视节目存储在一个数组列表中。我被其他所有事情困住了。

tvShowData.csv 的样本:

Title,audience ,network,actor 1,actor 2,actor 3,actor 4,TV Show Type
The Walking Dead,11.24,AMC,Norman Reedus,Andrew Lincoln,Lauren Cohan,Steven Yeun,Dark
Teen Wolf,3.02,MTV,Dylan O'Brien,Tyler Posey,Holland Roden,Tyler Hoechlin,Dark
  Scanner keyboard = new Scanner(System.in);
  String file = "tvshowData.csv";
  List<List<String>> tvShows = new ArrayList<>();
  String line;
  String userInput;
  
  try (BufferedReader br = new BufferedReader(new FileReader(file))) {
      while ((line = br.readLine()) != null) {
          String[] shows = line.split(",");
          tvShows.add(Arrays.asList(shows));
     }
     System.out.println(tvShows);
  }
  System.out.println("Enter the TV Show you want to know about:");
  userInput = keyboard.nextLine();

// Superclass
public class TVShows
{
   private String title;
   private double audience;
   private String network;
   private String actor1, actor2, actor3, actor4;

   public TVShows(String title, double audience, String network)
   {
      this.title = title;
      this.audience = audience;
      this.network = network;
   }

   public TVShows(String actor1, String actor2, String actor3, String actor4)
   {
      this.actor1 = actor1;
      this.actor2 = actor2;
      this.actor3 = actor3;
      this.actor4 = actor4;
   }

   public String getTitle()
   {
      return title;
   }

   public double getAudience()
   {
      return audience;
   }

   public String network()
   {
      return network;
   }

   public String getActor1()
   {
      return actor1;
   }

   public String getActor2()
   {
      return actor2;
   }

   public String getActor3()
   {
      return actor3;
   }

   public String getActor4()
   {
      return actor4;
   }

}

// Subclass
public class Dark extends TVShows
{
    private String tvShowType;

    public Dark(String nameOfShow, double audience, String network)
    {
        super(nameOfShow, audience, network);
    }
   
    public Dark(String actor1, String actor2, String actor3, String actor4)
    {
        super(actor1, actor2, actor3, actor4);
    }
   
    public void setTvShowType(String tvShowType)
    {
        this.tvShowType = tvShowType;
    }
   
    public String getTvShowType()
    {
        return tvShowType;
    }
}
        

【问题讨论】:

  • 用户可以询问有关节目的具体细节,例如首映的网络或演员的姓名。
  • 对“如何搜索特定字段”的简短回答是使用循环扫描数组并检查字符串是否匹配 if(showString.equals(inputString)){...} 或包含输入 if(showString.contains(inputString)){...} . Abra 提到的更好的答案是创建一个自定义类/对象来存储数据,以便您可以更轻松地管理数据。
  • @Abra 我已经为每个电视节目类型创建了一个电视节目超类和子类。我还将电视节目存储在提示中指定的数组列表中。我不知道如何获取用户输入的电视节目以及用户想知道的关于该节目的具体细节并显示它。
  • 一个提示,主要是你应该有一个包含所有字段的构造函数,因为它用于获取填充了所有字段的实例,使用你的构造函数,实例只是部分填充了数据(演员或其他一些字段)。说使用填充演员的构造函数,然后在创建对象后手动添加标题。似乎有很多额外的工作(假设您知道您不能申请相同的对象 2 构造函数)。此外,这里的专业化有点多余,只需在超类上添加一个额外的字段(可能是 enum : dark 等)
  • 另一个提示,对于演员,你可以在 csv 结尾处所有演员,你可以摆脱强制有 4 个演员的限制。直到演员,所有字段都是必需的并且知道演员开始的位置。使用它来获取演员列表(比如说一个节目可以有 30 个演员,所以你必须写一个 30 个文件和构造函数 +30 个参数。非常冗长)。 List of actors 可以装多少你想要的,只要看看演员提供的代码。

标签: java csv arraylist


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-02-24
    • 2018-11-27
    • 1970-01-01
    • 1970-01-01
    • 2014-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多