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在本练习中,我建议您使用罪状枚举,以便您可以添加应用程序将识别的其他罪状