0

私の課題では、犯罪者の名前、犯罪、および有罪判決の年を入力するようにユーザーに促し、別のクラス (データベース) を使用して配列に格納する犯罪記録プログラムを作成するように求められます。クラスは次のようになります。

class Database { 
   String name;
   String crime;
   int year;
}

自分の情報を入力する方法を作ったのですが、リストを表示するためにテストしたところ、最後に入力した犯罪者しか表示されませんでした。なぜこれを行うのですか?

//method to input criminal records
public static void inputData() throws IOException {
    arr = new Database[3];        
    Database temp = new Database();        

    for(int i = 0; i < arr.length; i++){
        System.out.print("Enter criminal first and last name: ");
        String name = br.readLine();
        temp.name = name;        

        System.out.print("Enter crime: ");
        String crime = br.readLine();
        temp.crime = crime;

        System.out.print("Enter the year of conviction: ");
        int year = Integer.valueOf(br.readLine()).intValue();
        temp.year = year;

        // Copy the name, crime, year to the global variables
        arr[i] = temp;
        System.out.println(arr[i].name + " was convicted in the year " + arr[i].year + " for " + arr[i].crime + ".");
    }
}

また、ユーザーが入力したキーワード (犯罪の種類) に基づいて順次検索を実行し、その種類の犯罪を行った犯罪者を表示する必要もあります。検索方法は次のとおりです。

//method to search data
public static int searchData() throws IOException{
    System.out.print("Which crime would you like to select? (arson, theft, assault) ");
    String searchKey = br.readLine();

    for (int i = 0; i < arr.length; i++){
        if (arr[i].crime.equals(searchKey)){ 
            return i;  //found it!
        }
    }
    //key was not found
    return -1;
}

先生の説明が下手なので、逐次検索について調べてみたのですが、その犯罪を犯した犯罪者の一覧を表示する方法がわかりません。

4

2 に答える 2

4

配列内の同じインスタンスへの参照を追加しています。ループ内で毎回新しいインスタンスを作成する必要があります。

// Database temp = new Database();   // Remove this

for(int i = 0; i < arr.length; i++) {
    Database temp = new Database();        

また、のフィールドに直接アクセスする代わりにDatabase:

temp.name = name;   

settersを使用し、フィールドを非公開にする必要があります。

temp.setName(name);
于 2013-09-15T15:36:43.867 に答える
0

この演習では、コードで説明されているように、アプリケーションがユーザーの入力から認識する他の犯罪を追加できるように、犯罪の列挙を使用することをお勧めします。

public enum Crime {
    ARSON{
        public String toString(){
            return "arson";
        }
    },
    ASSAULT{
        public String toString(){
            return "assault";
        }
    },
    THEFT{
        public String toString(){
            return "theft";
        }
    };

    public static String types(){
        return ARSON + ", " + ASSAULT + ", " + THEFT;
    }
}

データベースという名前は誤解を招くので、犯罪者には使用しません。Criminal または Outlaw の方が適切です。

public class Outlaw {
    private String name;
    private Crime crime;
    private int year;

    public Outlaw(String name, Crime crime, int year){
        this.name=name;
        this.crime=crime;
        this.year=year;
    }
    public String getName() {
        return name;
    }
    public Crime getCrime() {
        return crime;
    }
    public int getYear() {
        return year;
    }
    @Override
    public String toString(){
        return new String(name + " was convicted in the year " + year + " for " + crime + ".");
    }
}

public class InputData {
    private static Scanner scanner;
    public static void main(String[] args) {
        scanner = new Scanner(System.in);
        List<Outlaw> criminals = inputData();
        showCriminals(criminals);
        showCriminalsForCrime(criminals);
        scanner.close();
    }
    public static List<Outlaw> inputData(){
        List<Outlaw> criminals = new ArrayList<Outlaw>();
        int numCriminals;

        System.out.print("How many criminals are you going to enter? ");
        numCriminals = scanner.nextInt(); scanner.nextLine();
        for(int i = 0; i < numCriminals; i++){
            criminals.add(inputOutlaw());
        }

        return criminals;
    }
    public static Outlaw inputOutlaw() {    
        System.out.print("Enter criminal first and last name: ");
        String name = scanner.nextLine();
        Crime crime = inputCrime();
        System.out.print("Enter the year of conviction: ");
        int year = scanner.nextInt(); scanner.nextLine();

        return new Outlaw(name, crime, year);
    }
    public static void showCriminalsForCrime(List<Outlaw> criminals){
        System.out.println("Search the criminals for their crime");
        Crime crime = inputCrime();
        List<Outlaw> criminalsForCrime = getCriminalsFor(crime,criminals);
        if(!criminals.isEmpty()){
            for(Outlaw criminal : criminalsForCrime){
                System.out.println(criminal.toString());
            }
        } else {
            System.out.println("There are not criminals for" + crime);
        }
    }
    public static Crime inputCrime(){
        Crime crime = null;

        while(crime == null){
            System.out.print("Which crime would you like to select? " + Crime.types() + ": ");
            try{
                crime = Crime.valueOf(scanner.nextLine().toUpperCase().trim());
            } catch(IllegalArgumentException e){
                System.out.println("The crime is not in the application!");
            }
        }

        return crime;
    }
    public static List<Outlaw> getCriminalsFor(Crime crime, List<Outlaw> criminals){
        List<Outlaw> criminalsForCrime = new ArrayList<Outlaw>();

        for(Outlaw criminal : criminals){
            if(criminal.getCrime().equals(crime)){
                criminalsForCrime.add(criminal);
            }
        }

        return criminalsForCrime;
    }
    public static void showCriminals(List<Outlaw> criminals){
        System.out.println("CRIMINALS: ");
        for(Outlaw criminal : criminals){
            System.out.println(criminal.toString());
        }
    }   
}

もっとよく説明するように先生に言ってください :D

于 2013-09-15T18:21:50.763 に答える