gpt4 book ai didi

java - 帮助使用 Java 编写的 ISBN Checker

转载 作者:行者123 更新时间:2023-11-29 06:09:34 24 4
gpt4 key购买 nike

我目前正在做一个用 java 编写的家庭作业,他的程序应该读取 ISBN 编号的文本文件并检查它们是否有效,然后打印出按词典顺序排序的有效或无效编号列表顺序(忽略破折号)。这是我所有的类(class):

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Scanner;
import java.util.logging.Level;
import java.util.logging.Logger;

public class Main {

public static void main(String[] args) {
ISBN isbn = new ISBN();
ISBNReader reader = new ISBNReader();
ISBNProcessor processor = new ISBNProcessor(reader, isbn);
ISBNPrinter printer = new ISBNPrinter(processor);


Scanner scan = new Scanner(System.in);
reader.setFileName("isbn.txt");

reader.setISBNNumbers();
processor.processISBNNumbers();
printer.printISBNNumbers();
}

}

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.util.ArrayList;
import java.util.Scanner;
import java.util.logging.Level;
import java.util.logging.Logger;

public class ISBNReader {

private ISBN isbn = new ISBN();
private ArrayList<ISBN> inISBN = new ArrayList<ISBN>();
private int[] isbnNums = new int[13];
private String fileName = "";
private String next = "";

public ISBNReader(){
}

public void setFileName(String fileName){
this.fileName = fileName;
}

public String getFileName(){
return fileName;
}

public void setISBNNumbers(){
try{
FileReader fr = new FileReader(fileName);
Scanner in = new Scanner(fr);
while(in.hasNextLine()){
next = in.next();
isbn.setISBNString(next);
inISBN.add(isbn);
}
in.close();

FileReader frNums = new FileReader(fileName);
Scanner scanNums = new Scanner(frNums);

while(scanNums.hasNextInt()){
for(int i = 0; i < 13; i++){
isbnNums[i] = scanNums.nextInt();
}
for(int i = 0; i < inISBN.size(); i++){
inISBN.get(i).setISBNNumbers(isbnNums);
}
scanNums.nextLine();
}
scanNums.close();
}
catch(FileNotFoundException ex){
Logger.getLogger(ISBNReader.class.getName()).log(Level.SEVERE, null, ex);
}

}

public ArrayList<ISBN> getISBNNumbers(){
return inISBN;
}
}

import java.util.ArrayList;

public class ISBNProcessor {

private ISBNReader reader = new ISBNReader();
private ISBN isbn = new ISBN();
private String numOnlyString;
private ArrayList<ISBN> inISBN = new ArrayList<ISBN>();
private ArrayList<ISBN> validISBNs = new ArrayList<ISBN>();
private ArrayList<ISBN> invalidISBNs = new ArrayList<ISBN>();
private boolean isNumOnly;
private int[] isbnNums = new int[13];

ISBNProcessor(ISBNReader reader, ISBN isbn){
this.reader = reader;
this.isbn = isbn;
inISBN = reader.getISBNNumbers();
}

public void processISBNNumbers(){
for(int i = 0; i <inISBN.size();i++){
isbnNums = inISBN.get(i).getISBNNumbers();
if(isbnNums[12] == (10 - ((isbnNums[0] + 3*isbnNums[1] +isbnNums[2] + 3*isbnNums[3] +
isbnNums[4] + 3*isbnNums[5] +isbnNums[6] + 3*isbnNums[7] +
isbnNums[8] + 3*isbnNums[9] +isbnNums[10] + 3*isbnNums[11])
% 10) % 10)){
validISBNs.add(inISBN.get(i));
}
else{
invalidISBNs.add(inISBN.get(i));
}
}
}

public ArrayList<ISBN> getValidISBNNumbers(){
return validISBNs;
}

public ArrayList<ISBN> getInvalidISBNNumbers(){
return invalidISBNs;
}

}

public class ISBNPrinter {

private ISBNReader reader = new ISBNReader();
private ISBN isbn = new ISBN();
private ISBNProcessor processor = new ISBNProcessor(reader, isbn);;

ISBNPrinter(ISBNProcessor processor){
this.processor = processor;
}

public void printISBNNumbers(){
System.out.println("Valid");
for(int i = 0; i < processor.getValidISBNNumbers().size(); i++){
System.out.println(processor.getValidISBNNumbers().get(i).getISBNString());
}

System.out.println("Invalid");
for(int i = 0; i < processor.getInvalidISBNNumbers().size(); i++){
System.out.println(processor.getInvalidISBNNumbers().get(i).getISBNString());
}
}
}

public class ISBN {

private int[] isbnNumbers = new int[13];
private String isbnString;
private String trash;


public ISBN(int[] isbn){
this.isbnNumbers = isbn;
}

ISBN() {
}

public void setISBNNumbers(int[] isbn){
this.isbnNumbers = isbn;
}

public int[] getISBNNumbers(){
return this.isbnNumbers;
}

public void setISBNString(String isbnString){
this.isbnString = isbnString;
}

public String getISBNString(){
return this.isbnString;
}
}

我遇到的问题是,当我打印出无效和有效的 ISBN 编号时,它只是重复打印出最后一个 ISBN 编号。像这样:

Valid
Invalid
978-04-2135-828-8
978-04-2135-828-8
978-04-2135-828-8
978-04-2135-828-8
978-04-2135-828-8
978-04-2135-828-8
978-04-2135-828-8
BUILD SUCCESSFUL (total time: 0 seconds)

文本文件如下所示:

978-04-2135-828-8
978-03-2135-828-8
97A-03-2135-828-8
978-1408819899
978-0-13-216675-1
978-0-13-601722-6
978-04-2135-828-8

任何建议或解决方案?我的节目将于今晚午夜(中部时间)到期,我真的很挣扎,所以任何帮助都会很棒!

谢谢!

我从 ISBN 中删除的方法:

public void stringToNumbers(){
for(int i = 0; i < isbnString.length(); i++){
if(isbnString.charAt(i) != '-' &&
(Integer.parseInt(isbnString.substring(i,i+1)) == 1 ||Integer.parseInt(isbnString.substring(i,i+1)) == 2 ||
Integer.parseInt(isbnString.substring(i,i+1)) == 3 ||Integer.parseInt(isbnString.substring(i,i+1)) == 4 ||
Integer.parseInt(isbnString.substring(i,i+1)) == 5 ||Integer.parseInt(isbnString.substring(i,i+1)) == 6 ||
Integer.parseInt(isbnString.substring(i,i+1)) == 7 ||Integer.parseInt(isbnString.substring(i,i+1)) == 8 ||
Integer.parseInt(isbnString.substring(i,i+1)) == 9 ||Integer.parseInt(isbnString.substring(i,i+1)) == 0)){

isbnNumbers[i] = (int) Integer.parseInt(isbnString.substring(i));
}
else{
return;

}

}
}

我删除了这个方法并添加了第二个 while 循环,但现在看来这是必要的。有人知道一种不用破折号传输数字的有效方法吗?上面的方法不行。

编辑:这是一种新方法,在遇到破折号之前似乎一直有效。

public void stringToNumbers(){
for(int i = 0; i < isbnString.length(); i++){
if(Character.isDigit(isbnString.charAt(i)))
isbnNumbers[i] = (isbnString.charAt(i)-48);

}
}

最佳答案

这里:

        while(in.hasNextLine()){
next = in.next();
isbn.setISBNString(next);
inISBN.add(isbn);
}

您正在更改 ISBN 对象中的 isbn 字符串并将其添加到您的列表中,但由于您从未创建新的 ISBN 对象,因此您一遍又一遍地将相同的对象添加到列表中,每次更改它都是isbn 字符串。但是由于它们是添加到列表中的所有项目都是完全相同的 ISBN 对象,因此所有项目都具有相同的 isbn 字符串。在最后一次循环中,列表中的所有项目都将引用最后添加的 isbn 字符串。

解决方案是每次您想将具有唯一字符串的新 ISBN 对象添加到列表中时,在此 while 循环中创建一个新的 ISBN 对象。所以应该调用

isbn = new ISBN();

while 循环顶部附近的某个地方。

有点像,

        while(in.hasNextLine()){
next = in.next();
ISBN isbn = new ISBN(); // added
isbn.setISBNString(next);
inISBN.add(isbn);
}

当您在您的程序中看到这样的事情发生时,请只查找这类问题——而不是在必要时创建一个新对象。造成这种情况的另一个常见原因是静态说明符的使用不当。

编辑 1
关于您最近的帖子以及您希望检查 char 是否为数字,Character 类有一个方法 isDigit(char ch) 可以为您执行此操作。

关于java - 帮助使用 Java 编写的 ISBN Checker,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7395426/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com