我目前正在编写用java编写的家庭作业,其中程序应该在ISBN号的文本文件中读取并检查它们是否有效,然后打印出按字典排序的有效或无效数字列表订单(忽略破折号)。 这是我的所有课程:
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);
}
}
答案 0 :(得分:3)
这里:
while(in.hasNextLine()){
next = in.next();
isbn.setISBNString(next);
inISBN.add(isbn);
}
您正在更改ISBN对象中的isbn字符串并将其添加到列表中,但由于您从未创建新的ISBN对象,因此每次更改它时,您都会将相同的对象一遍又一遍地添加到列表中isbn String。但由于它们是添加到列表中的所有项目,因此完全相同的ISBN对象都具有相同的isbn String。在最后一次循环中,列表中的所有项目都将引用最后添加的isbn字符串。
解决方案是每次要在列表中添加具有唯一String的新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)为你做这个。
答案 1 :(得分:0)
你已经完成了非常复杂和漫长的计划。 这是一种更短更好的方法: -
import java.io.*;
public class ISBN
{
public static void main(String args[])throws IOException
{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n,r,d = 0; int count = 0; int k = 11;
System.out.println("Enter the ISBN number :");
n = Integer.parseInt(br.readLine());
while (n!=0)
{
r = n%10;
k -= 1;
count++;
d += (k*r);
n = n/10;
}
if (count == 10)
{
if (d%11 == 0) System.out.println("Legal ISBN number");
else System.out.println("Illegal ISBN number");
}
else System.out.println("Illegal ISBN number");
}
}