Java 带关键字的顺序搜索

Java 带关键字的顺序搜索,java,arrays,search,sequential,Java,Arrays,Search,Sequential,我的作业要求我制作一个犯罪记录程序,提示用户输入犯罪名称、犯罪和定罪年份,并使用另一个类(数据库)将其存储在数组中。该类如下所示: class Database { String name; String crime; int year; } 我做了一个方法来输入我的信息,但当我测试它来显示列表时,它只显示了我输入的最后一个罪犯。为什么要这样做 //method to input criminal records public static void inputData()

我的作业要求我制作一个犯罪记录程序,提示用户输入犯罪名称、犯罪和定罪年份,并使用另一个类(数据库)将其存储在数组中。该类如下所示:

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 + ".");
    }
}
//输入犯罪记录的方法
公共静态void inputData()引发IOException{
arr=新数据库[3];
数据库温度=新数据库();
对于(int i=0;i
我还需要根据用户输入的关键字(犯罪类型)进行顺序搜索,然后显示犯下该类型犯罪的罪犯。以下是搜索的方法:

//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;
}
//搜索数据的方法
public static int searchData()引发IOException{
System.out.print(“您希望选择哪种犯罪?(纵火、盗窃、袭击)”;
String searchKey=br.readLine();
对于(int i=0;i

我的老师很难解释,所以我做了关于顺序搜索的研究,但我仍然不知道如何让它显示犯下该罪行的罪犯名单

您正在向数组中的同一实例添加引用。每次在循环内都应创建新实例:

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

for(int i = 0; i < arr.length; i++) {
    Database temp = new Database();        
您应该使用setter,并将字段设置为私有:

temp.setName(name);

您正在向数组中的同一实例添加引用。每次在循环内都应创建新实例:

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

for(int i = 0; i < arr.length; i++) {
    Database temp = new Database();        
您应该使用setter,并将字段设置为私有:

temp.setName(name);

在本练习中,我建议您使用罪状枚举,以便添加应用程序将从用户输入中识别的其他罪状,如代码所述

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;
    }
}
我不会使用罪犯的姓名数据库,因为它具有误导性。罪犯或歹徒更合适

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());
        }
    }   
}
public-class-unlaw{
私有字符串名称;
私人犯罪;
私人国际年;
公犯(字串名称,犯罪,整数年){
this.name=name;
这个。犯罪=犯罪;
今年=年;
}
公共字符串getName(){
返回名称;
}
公共犯罪{
回归犯罪;
}
公共int getYear(){
回归年;
}
@凌驾
公共字符串toString(){
返回新字符串(name+“在“+year+”年因“+crime+”被定罪);
}
}
公共类输入数据{
专用静态扫描仪;
公共静态void main(字符串[]args){
扫描仪=新扫描仪(System.in);
List=inputData();
展示罪犯(罪犯);
展示犯罪(罪犯);
scanner.close();
}
公共静态列表inputData(){
列出罪犯=新建ArrayList();
国际货币基金组织;
System.out.print(“您将进入多少罪犯?”);
numCriminals=scanner.nextInt();scanner.nextLine();
对于(int i=0;i

告诉您的老师更好地解释:D在本练习中,我建议您使用罪状枚举,以便您可以添加应用程序将识别的其他罪状