【问题标题】:How to create a search method for an array如何为数组创建搜索方法
【发布时间】:2015-04-16 21:55:51
【问题描述】:

我的代码如下:

import java.io.*;
import java.util.*;

public class readStudents extends Object
{ 
    private String SName = "";
    private String DoB = "";
    private String Gender = "";
    private String Address = "";
    Student [] students = new Student[20];


    public void fillStudentArray()
    {
        // properties

        int size; // total number of Students in collection

        File file = new File("StudentDetails.txt");

    try
    {
        Scanner in  = new Scanner(file);


        while(in.hasNextLine())
        {
            String SName = in.next();
            String DoB = in.next();
            String Gender = in.next();
            String Address = in.next();

        }

    }

    catch (FileNotFoundException e)
    {
        e.printStackTrace();
    }

    }   

    public String getName()
    {
        return this.SName;
    } 

    public void printname()
    {
        System.out.println("hello");
    }
    public Student search(String name)
    {
        System.out.print("Enter the name you wish to search: ");

        for (int i = 0; i < this.students.length; i++)
        {
            Student s = this.students[i];
            if (s.getName().equalsIgnoreCase(name))
            {
                return s;
            }
        }
        return null; 
    }
}   //end class students

但是,我正在尝试创建一个完善的程序,我可以从另一个主文件中调用这些方法,并在该文件中使用尽可能少的代码。

底部的搜索方法让我感到困惑,因为我假设我需要在getName() 方法中对数组做一些事情,但我无法弄清楚。

由于我将这个作为另一个主方法的类,通过放置我的数组初始化和声明,它允许其他方法访问它,但它让我无法从主方法创建这个数组,除非我错过了什么?

这是jCreator 抛出的错误:

F:\University\Ass2\readStudents.java:62: error: cannot find symbol
            if (s.getName().equalsIgnoreCase(name))

                 ^
symbol:   method getName()
location: variable s of type Student

【问题讨论】:

  • 显示学生类的代码
  • @Nate_thp,您可能想要坚持 Java 命名约定(它在每本书中都适用于初学者),例如one from Sunone from Googleclass readStudentsprivate String SName 是错误的编码方式

标签: java arrays search jcreator


【解决方案1】:

您从未填充过 Student students[] 数组...您在此处检索了要填充它们的值:

while(in.hasNextLine())
    {
        String SName = in.next();
        String DoB = in.next();
        String Gender = in.next();
        String Address = in.next();

    }

但您从未真正将这些值设置到 students[] 数组中的 Student 对象中

做这样的事情:

int i = 0;

while(in.hasNextLine())
    {
        String name = in.next();
        String dateOfBirth = in.next();
        String gender = in.next();
        String address = in.next();

        students[i] = new Student(name, dateOfBirth, gender, address);
        i++
    }

另外,您可能会考虑放弃数组并使用某种 List 或 Hash 对象...如果您的文件包含超过 20 行,当您尝试定义第 21 个值时,数组将超出索引。使用一个数组列表或一个列表你不会有这个问题

【讨论】:

    【解决方案2】:

    我冒昧地调整了您的代码,如前面提到的答案,在您的情况下最好使用数组列表。您可以在阅读器中创建一个小型学生容器类。 get name 方法也有点多余;s

    package test;
    
    import java.io.*;
    import java.util.*;
    
    public class readStudents{
    
        ArrayList<Student> students = new ArrayList<Student>();
    
        class Student {
    
            private String name;
            private String dob;
            private String gender;
            private String address;
    
            public Student(String name, String dob, String gender, String address) {
                this.name = name;
                this.dob = dob;
                this.gender = gender;
                this.address = address;
            }
    
            public void fillStudentArray() {
                // properties
    
                int size; // total number of Students in collection
    
                File file = new File("StudentDetails.txt");
    
                try {
                    Scanner in = new Scanner(file);
    
                    while (in.hasNextLine()) {
                        String SName = in.next();
                        String DoB = in.next();
                        String Gender = in.next();
                        String Address = in.next();
    
                        students.add(new Student(SName, DoB, Gender, Address));
                    }
    
                }
    
                catch (FileNotFoundException e) {
                    e.printStackTrace();
                }
    
            }
    
            public String getName(Student student) {
                return student.name;
            }
    
            public void printname() {
                System.out.println("hello");
            }
    
            public Student search(String name) {
                System.out.print("Enter the name you wish to search: ");
    
                for (Student student : students) {
                    if (student.name.equalsIgnoreCase(name))
                        ;
                    return student;
                }
    
                return null;
            }
        }
    }
    

    【讨论】:

      【解决方案3】:

      如果您的老师没有强迫您在搜索功能中使用 for 或 for-each 循环 - 这就是如何使用 Java 8 方式进行全面扫描

      public Optional<Student> findFirstByName(final String name) {
          return Arrays.stream(students)
                  .filter(s -> s.getName().equalsIgnoreCase(name))
                  .findFirst();
      }
      

      【讨论】:

        猜你喜欢
        • 2017-08-07
        • 1970-01-01
        • 2010-10-26
        • 1970-01-01
        • 2020-03-27
        • 1970-01-01
        • 2014-04-28
        • 1970-01-01
        • 2011-12-06
        相关资源
        最近更新 更多