java - 给定相应的用户输入,如何在 CSV 文件中搜索特定字段?
问题描述
创建一个类,作为这些电视节目类型的父类:家庭、喜剧、黑暗、神秘、其他。
每种类型的电视节目都应从该父类继承。确定父类中存在哪些数据和方法以及每个子类中存在什么每个子类应该有两个构造函数。在 main() 程序中,将所有电视节目存储在一个 ArrayList 中使用一个 while 循环来询问用户他们想问什么节目,然后回答与电视节目有关的问题。使用 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;
}
}
解决方案
主要是你可以使用类似的东西,但你必须适应你的输入。
匹配是基于使用各种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
推荐阅读
- swift - 从静态方法传递子类型的创建实例到闭包的问题
- android - 在Android中使图像的黑色部分透明opencv
- ios - Firebase_messaging:^9.0.0 不起作用
- python - 执行命令时出现ffmpeg语法错误
- grails - 使用 liquibase 向 grails 中的用户表添加列后无法登录
- typescript - 如何一般键入返回对象数组的值数组的函数?
- python-3.x - 主窗口的 Python 3.x / PySide2 / focusOutEvent 未触发
- javascript - 如果浏览器的搜索栏打开,如何检测 Escape 键?
- asp.net-mvc - IIS 不反映我的 ASP.NET MVC 视图更改
- regex - 正则表达式匹配 2 个其他字符串之间的 URL 字符串*然后*替换一些文本