帮助用Java编写的ISBN Checker

时间:2011-09-13 00:04:10

标签: java

我目前正在编写用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);

        }
    }

2 个答案:

答案 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");
    }
}