第20 章 : JavaIO程式設計案例
91 數字大小比較
輸入3個整數,并求出3個整數最大值和最小值
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
class InputUtil {
/**
* 讀取指定個數的整數輸入
*
* @param num 指定要輸入的整數個數
* @return 所有讀取的整數數組
* @throws IOException
*/
public static int[] getIntList(int num) throws IOException {
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
System.out.println("請輸入" + num + "個整數:");
int[] list = new int[num];
int count = 0;
while (count < num) {
String msg = reader.readLine();
if (msg.matches("\\d+")) {
list[count++] = Integer.parseInt(msg);
} else {
System.out.println("請輸入整數");
}
}
reader.close();
return list;
}
}
class NumberUtil {
/**
* 擷取int 型數組中最大值和最小值
*
* @param list 整數數組
* @return int[] {max, min}
*/
public static int[] getMaxMin(int[] list) {
int max = list[0];
int min = list[0];
for (int x : list) {
if (x > max) {
max = x;
}
if (min > x) {
min = x;
}
}
return new int[]{max, min};
}
}
class Demo {
public static void main(String[] args) throws IOException {
// 讀取3個資料
int[] list = InputUtil.getIntList(3);
int[] data = NumberUtil.getMaxMin(list);
System.out.println("最大值:" + data[0]);
System.out.println("最小值:" + data[1]);
}
}
92 檔案儲存
從鍵盤輸入檔案名和檔案内容,然後将檔案内容儲存到檔案中
1、定義接口
2、工具類
3、實作接口類
4、工廠類
5、測試函數
import java.io.*;
class InputUtil {
private static final BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
public static String getInput(String prompt) {
System.out.println(prompt);
String msg = null;
while (true) {
try {
msg = reader.readLine();
if (!"".equals(msg)) {
break;
} else {
System.out.println("請輸入非空字元串:");
}
} catch (IOException e) {
}
}
return msg;
}
}
interface IFileService {
public static final String FILE_DIR = "demo";
public boolean save();
}
class FileServiceImpl implements IFileService {
private String filename;
private String content;
public FileServiceImpl() {
this.filename = InputUtil.getInput("請輸入檔案名");
this.content = InputUtil.getInput("請輸入檔案内容");
}
@Override
public boolean save() {
String fullname = this.FILE_DIR + File.separator + this.filename;
PrintWriter writer = null;
try {
writer = new PrintWriter(fullname);
writer.print(this.content);
} catch (FileNotFoundException e) {
e.printStackTrace();
} finally {
if (writer != null) {
writer.close();
}
}
return false;
}
}
class Factory{
private Factory(){}
public static FileServiceImpl getInstance(){
return new FileServiceImpl();
}
}
class Demo {
// 項目啟動時建立檔案夾
static {
File file = new File(IFileService.FILE_DIR);
if (!file.exists()) {
file.mkdirs();
}
}
public static void main(String[] args) throws IOException {
FileServiceImpl fileService = Factory.getInstance();
fileService.save();
}
}
93 字元串逆序顯示
鍵盤傳入多個字元串到程式中,并将它們按照逆序輸出到螢幕
設計考慮:
1、字元串内容随時修改,使用StringBuffer
2、由使用者自己決定是否繼續輸入
實作步驟
1、定義接口 操作标準
2、定義實作類
3、定義工廠類
4、編寫輔助類
5、編寫測試類
實作代碼
IStringService.java
public interface IStringService {
public void append(String str);
public String[] reverse();
}
StringServiceImpl.java
public class StringServiceImpl implements IStringService{
private StringBuffer data = new StringBuffer();
public void append(String str){
this.data.append(str).append("|");
}
public String[] reverse(){
String[] list = this.data.toString().split("\\|");
String[] tmp = new String[list.length];
for(int i=0; i<list.length; i++){
tmp[i] = list[list.length - i - 1];
}
return tmp;
}
}
InputUtil.java
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
class InputUtil {
private static final BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
public static String getString(String prompt) {
System.out.println(prompt);
String msg = null;
while (true) {
try {
msg = reader.readLine();
if (!"".equals(msg)) {
break;
} else {
System.out.println("請輸入非空字元串:");
}
} catch (IOException e) {
}
}
return msg;
}
public static void main(String[] args) {
System.out.println(InputUtil.getString("請輸入"));
}
}
Factory.java
class Factory{
private Factory(){}
public static StringServiceImpl getInstance(){
return new StringServiceImpl();
}
}
Menu.java
import java.util.Arrays;
public class Menu {
private StringServiceImpl stringServiceImpl;
public Menu() {
this.stringServiceImpl = Factory.getInstance();
this.choose();
}
public void choose() {
help();
String msg = InputUtil.getString("請選擇:");
switch (msg) {
case "1":
this.stringServiceImpl.append(InputUtil.getString("請輸入字元串:"));
choose();
case "2":
System.out.println(Arrays.toString(this.stringServiceImpl.reverse()));
choose();
case "0":
System.exit(0);
default:
choose();
}
}
public static void help() {
System.out.println("[1]輸入内容:");
System.out.println("[2]輸出反轉内容:");
System.out.println("[0]退出");
}
}
Demo.java
class Demo{
public static void main(String[] args) {
new Menu();
}
}
94 資料排序處理
鍵盤輸入資料
姓名:成績|姓名:成績
eg:
Tom:89|Jack:91|Tony:86
按照成績由高到低排序
思路:
Comparable + Arrays
代碼實作
IStudentService.java
public interface IStudentService {
Student[] getData();
}
Student.java
public class Student implements Comparable<Student>{
private String name;
private double score;
public Student(String name, double score) {
this.name = name;
this.score = score;
}
@Override
public String toString() {
return "Student<" + name + ", " + score + '>';
}
@Override
public int compareTo(Student obj) {
return Double.compare(obj.score, this.score);
}
}
StudentServiceImpl.java
import java.util.Arrays;
public class StudentServiceImpl implements IStudentService {
private String content;
private Student[] students;
public StudentServiceImpl(String content) {
this.content = content;
this.handle();
}
private void handle(){
String[] list = this.content.split("\\|");
this.students = new Student[list.length];
for(int i=0; i<list.length; i++){
String[] items = list[i].split(":");
this.students[i] = new Student(items[0], Double.parseDouble(items[1]));
}
}
@Override
public Student[] getData() {
Arrays.sort(this.students);
return this.students;
}
}
public class Factory {
private Factory(){}
public static StudentServiceImpl getInstance(){
return new StudentServiceImpl(InputUtil.getString("請輸入資料:"));
}
}
import java.util.Arrays;
public class Demo {
public static void main(String[] args) {
// Tom:89|Jack:91|Tony:86
System.out.println(Arrays.toString(Factory.getInstance().getData()));
// [Student<Jack, 91.0>, Student<Tom, 89.0>, Student<Tony, 86.0>]
}
}
95 資料排序處理深入
擴充上一節内容,将輸入資訊儲存到檔案中,還可以添加資訊,并且檢視全部資料
确認儲存位置
格式統一
FileUtil.java檔案讀取工具類
package util;
import java.io.*;
import java.util.Scanner;
public class FileUtil {
public static String read(File file) throws FileNotFoundException {
Scanner scanner = new Scanner(file);
StringBuilder contents = new StringBuilder();
while (scanner.hasNext()) {
contents.append(scanner.next());
}
scanner.close();
return contents.toString();
}
public static void append(File file, String content) throws IOException {
PrintWriter writer = new PrintWriter(new FileWriter(file, true));
writer.write(content);
writer.close();
}
public static void save(File file, String content) throws IOException {
PrintWriter writer = new PrintWriter(file);
writer.write(content);
writer.close();
}
public static void main(String[] args) throws IOException {
File file = new File("demo.txt");
FileUtil.save(file, "你好");
FileUtil.append(file, "你也好");
System.out.println(FileUtil.read(file));
}
}
96 奇偶數統計
輸入字元串拆分後統計奇數,偶數個數
接口INumberService.java
public interface INumberService {
public int[] handle();
}
實作類 NumberServiceImpl.java
import util.InputUtil;
public class NumberServiceImpl implements INumberService{
private String str;
public NumberServiceImpl(){
this.str = InputUtil.getString("請輸入數字串:");
}
@Override
public int[] handle() {
String[] numbers = this.str.split("");
// 偶數, 奇數
int[] result = new int[]{0, 0};
for(String num : numbers){
if(Integer.parseInt(num) % 2 == 0){
result[0] ++;
} else{
result[1] ++;
}
}
return result;
}
}
測試類 Demo.java
import java.util.Arrays;
public class Demo {
public static void main(String[] args) {
System.out.println(Arrays.toString(new NumberServiceImpl().handle()));
// 1234567890
// [5, 5]
}
}
97 使用者登入
輸入使用者名和密碼 root 123456
如果沒有輸入則提示輸入
輸入錯誤3次退出
提示登入成功
真實業務隻實作核心功能,輔助邏輯處理交給代理控制
接口類
IUserService
isExit
login
實作類
UserServiceImpl
代理類
UserServiceProxy
工廠類
Factory
測試類
Demo
IUserService.java
public interface IUserService {
public boolean isExit();
public boolean login(String name, String password);
}
UserServiceImpl.java
public class UserServiceImpl implements IUserService{
private int tryCount = 0;
@Override
public boolean isExit() {
// 超過三次錯誤
return this.tryCount >= 3;
}
/**
* 實作核心邏輯
*/
@Override
public boolean login(String name, String password) {
this.tryCount ++;
if("root".equals(name) && "123456".equals(password)){
return true;
} else{
return false;
}
}
}
UserServiceProxy.java
import util.InputUtil;
public class UserServiceProxy implements IUserService {
private IUserService userService;
public UserServiceProxy(IUserService userService) {
this.userService = userService;
}
@Override
public boolean isExit() {
return this.userService.isExit();
}
/**
* 實作輔助邏輯
*/
@Override
public boolean login(String name, String password) {
while (!this.isExit()) {
String inputName = InputUtil.getString("請輸入使用者名:");
String inputPassword = InputUtil.getString("請輸入密碼:");
if (this.userService.login(inputName, inputPassword)) {
System.out.println("登入成功");
System.exit(0);
} else {
System.out.println("使用者名或密碼錯誤,請重試");
}
}
System.out.println("重試次數過多,請稍後重試");
return true;
}
}
import util.InputUtil;
public class Factory {
private Factory(){}
public static IUserService getInstance(){
return new UserServiceProxy(new UserServiceImpl());
}
}
public class Demo {
public static void main(String[] args) {
Factory.getInstance().login(null, null);
}
}
98 投票選舉
1、輸入候選人名單
2、統計每個候選人票數
3、顯示最終投票結果
思路分析
1、定義資料結構:
Student
name
sid
vote
2、操作接口類
IVoteService
void inc(int sid)
Student[] result() 排序資料
Student[] getData() 未排序資料
3、實作類
VoteServiceImpl
4、工廠類
Factory
5、測試類
Demo
資料結構 Student.java
public class Student implements Comparable<Student> {
private String name;
private int sid;
private int vote;
public Student(String name, int sid, int vote) {
this.name = name;
this.sid = sid;
this.vote = vote;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getSid() {
return sid;
}
public void setSid(int sid) {
this.sid = sid;
}
public int getVote() {
return vote;
}
public void setVote(int vote) {
this.vote = vote;
}
@Override
public int compareTo(Student obj) {
return obj.vote - this.vote;
}
@Override
public String toString() {
return String.format("[%s] %s - %s", sid, name, vote);
}
}
接口 IVoteService.java
public interface IVoteService {
public void inc(int sid);
public Student result();
public Student[] getData();
}
實作類 VoteServiceImpl.java
import util.InputUtil;
import java.util.Arrays;
public class VoteServiceImpl implements IVoteService {
private Student[] students;
public VoteServiceImpl() {
this.students = new Student[]{
new Student("張三", 1, 0),
new Student("李四", 2, 0),
new Student("王五", 3, 0),
};
}
@Override
public void inc(int sid) {
for(Student s : this.students){
if(s.getSid() == sid){
s.setVote(s.getVote() + 1);
}
}
}
@Override
public Student result() {
Arrays.sort(this.students);
return this.students[0];
}
@Override
public Student[] getData() {
return this.students;
}
}
工産類 Factory.java
public class Factory {
private Factory(){}
public static IVoteService getInstance(){
return new VoteServiceImpl();
}
}
菜單類 Menu.java
import util.InputUtil;
import java.util.Arrays;
public class Menu {
private IVoteService voteService;
public Menu() {
this.voteService = Factory.getInstance();
this.choose();
}
public void choose(){
this.help();
String num = InputUtil.getString("請選擇:");
switch (num){
case "1":
String sid = InputUtil.getString("請輸入候選人id");
this.voteService.inc(Integer.parseInt(sid));
this.choose();
break;
case "2":
System.out.println(Arrays.toString(this.voteService.getData()));
this.choose();
break;
case "3":
System.out.println(this.voteService.result());
this.choose();
break;
case "0":
System.out.println("拜拜...");
System.exit(0);
default:
help();
this.choose();
}
}
public void help(){
System.out.println("【1】候選人增加票數");
System.out.println("【2】顯示投票統計");
System.out.println("【3】顯示統計結果");
System.out.println("【0】退出系統");
}
}
public class Demo {
public static void main(String[] args) {
new Menu();
}
}