Browse Source

上传文件至 'project/command'

main
LiuZihan 4 weeks ago
parent
commit
36159d93b2
  1. 33
      project/command/HelpCommand.java
  2. 29
      project/command/ListCommand.java
  3. 35
      project/command/SearchCommand.java
  4. 33
      project/command/StatCommand.java

33
project/command/HelpCommand.java

@ -0,0 +1,33 @@
package com.example.moviecli.command;
import com.example.moviecli.repository.MovieRepository;
import com.example.moviecli.view.ConsoleView;
public class HelpCommand implements Command {
private final ConsoleView view;
public HelpCommand(ConsoleView view) {
this.view = view;
}
@Override
public String getName() {
return "help";
}
@Override
public void execute(String[] args, MovieRepository repository) {
view.printInfo("可用命令:");
view.printInfo(" crawl <url> - 爬取指定网站的数据");
view.printInfo(" list - 列出所有记录");
view.printInfo(" search <词> - 按标题搜索");
view.printInfo(" stat - 统计评分分布");
view.printInfo(" export - 导出为 movies.csv");
view.printInfo(" help - 显示本帮助");
view.printInfo(" exit - 退出程序");
view.printInfo("\n支持的 URL 示例:");
view.printInfo(" https://movie.douban.com/top250");
view.printInfo(" https://news.sina.com.cn/");
view.printInfo(" https://book.douban.com/top250");
}
}

29
project/command/ListCommand.java

@ -0,0 +1,29 @@
package com.example.moviecli.command;
import com.example.moviecli.repository.MovieRepository;
import com.example.moviecli.view.ConsoleView;
import com.example.moviecli.model.Movie;
public class ListCommand implements Command {
private final ConsoleView view;
public ListCommand(ConsoleView view) {
this.view = view;
}
@Override
public String getName() {
return "list";
}
@Override
public void execute(String[] args, MovieRepository repository) {
var movies = repository.getAll();
if (movies.isEmpty()) {
view.printInfo("暂无数据,请先执行 crawl <url>。");
return;
}
for (Movie m : movies) {
System.out.println(m.getRank() + ". " + m.getTitle() + " - " + m.getScore());
}
}
}

35
project/command/SearchCommand.java

@ -0,0 +1,35 @@
package com.example.moviecli.command;
import com.example.moviecli.model.Movie;
import com.example.moviecli.repository.MovieRepository;
import com.example.moviecli.view.ConsoleView;
public class SearchCommand implements Command {
private final ConsoleView view;
public SearchCommand(ConsoleView view) {
this.view = view;
}
@Override
public String getName() {
return "search";
}
@Override
public void execute(String[] args, MovieRepository repository) {
if (args.length < 2) {
view.printError("用法: search <关键词>");
return;
}
String keyword = args[1].toLowerCase();
var result = repository.getAll().stream()
.filter(m -> m.getTitle().toLowerCase().contains(keyword))
.toList();
if (result.isEmpty()) {
view.printInfo("没有找到包含 \"" + keyword + "\" 的记录。");
} else {
result.forEach(m -> System.out.println(m.getRank() + ". " + m.getTitle() + " - " + m.getScore()));
}
}
}

33
project/command/StatCommand.java

@ -0,0 +1,33 @@
package com.example.moviecli.command;
import com.example.moviecli.repository.MovieRepository;
import com.example.moviecli.view.ConsoleView;
import java.util.Map;
import java.util.stream.Collectors;
import com.example.moviecli.model.Movie;
public class StatCommand implements Command {
private final ConsoleView view;
public StatCommand(ConsoleView view) {
this.view = view;
}
@Override
public String getName() {
return "stat";
}
@Override
public void execute(String[] args, MovieRepository repository) {
var movies = repository.getAll();
if (movies.isEmpty()) {
view.printInfo("无数据,请先 crawl。");
return;
}
Map<String, Long> scoreCount = movies.stream()
.collect(Collectors.groupingBy(Movie::getScore, Collectors.counting()));
view.printInfo("评分分布:");
scoreCount.forEach((score, count) ->
System.out.println(score + " 分 -> " + count + " 条"));
}
}
Loading…
Cancel
Save