对对象的 ArrayList 使用 indexOf() 方法

Using indexOf() method for ArrayList of objects

在我的程序中,我有一个 Vendor class 和一个 Hospital class 并将这些 classes 的实例存储在名为 vendors 和 hospitals 的数组列表中。我的供应商 class 有一个字符串数组,其中包含与医院 class 实例相对应的医院名称。我正在尝试找到一种方法,从属于供应商 class 的字符串数组中的医院名称到获取医院数组列表的该医院的索引值。如果这个 post 没有多大意义,我深表歉意,我对编码还很陌生。任何帮助将不胜感激。

编辑:请使用 Ctrl+F 和以下命令跳转到有问题的特定代码行

//检查是否是医院

供应商Class

package com.company;
import java.util.Arrays;
import java.util.Scanner;

public class Vendor {

    //static variables are the same for all vendor instances
    static int numOfHospitals;
    static int numOfAppointments;

    //non-static variables are specific to one vendor instance
    int priorityNum;
    String salespersonName;
    String vendorCompanyName;
    String [] vendorPicks;
    String[] vendorSchedule;

    public void printVendorSchedule() {
        System.out.println(Arrays.toString(vendorSchedule));
    }

    public void printVendorPicks () {
        System.out.println(Arrays.toString(vendorPicks));
    }

    public String getVendorSchedule (int appointmentSlot) {
        return vendorSchedule [appointmentSlot];
    }

    public String getVendorPick (int currentHospitalPick) {
        return vendorPicks[currentHospitalPick];
    }

    public boolean checkVendorSchedule (int appointmentSlot) {
        return ((vendorSchedule[appointmentSlot]).equals("open"));
    }

    public void setVendorAppointment (int appointmentSlot, String hospitalName) {
        vendorSchedule[appointmentSlot] = hospitalName;
    }

    public Vendor createNewVendor(int priorityNum, int numOfAppointments, int numOfHospitals, String salespersonName, String vendorCompanyName){
        this.priorityNum=priorityNum;
        this.salespersonName=salespersonName;
        this.vendorCompanyName=vendorCompanyName;
        this.vendorPicks = new String[numOfHospitals];
        this.vendorSchedule = new String[numOfAppointments];
        for (int i = 0; i <numOfAppointments; i++) {
            this.vendorSchedule[i] = "open";
        }
        Scanner input = new Scanner(System.in);
        Vendor vendorToAdd = new Vendor();

        //loop to add vendor's hospital picks
        int counter = 0;
        while (counter < numOfHospitals) {
            System.out.println("Enter the #" +(counter+1) +" hospital for "+salespersonName+". If there are no more hospitals for this vendor, enter Done.");
            String placeHolder = input.nextLine();
            if (placeHolder.equalsIgnoreCase("done")) {
                break;
            }
            vendorPicks[counter]=placeHolder;
            counter++;


        }
        return vendorToAdd;
    }
}

医院Class

package com.company;
import java.util.Scanner;
import java.util.Arrays;
import java.util.ArrayList;

public class Hospital {

    //static variables here
    int numOfAppointments;
    int numOfHospitals;
    //non-static variables here
   String nameHospital;
   String nameDirector;
   String [] hospitalSchedule;

   public void printHospitalSchedule () {
       System.out.println(Arrays.toString(hospitalSchedule));
   }

   public String getHospitalSchedule(int appointmentSlot) {
       return hospitalSchedule[appointmentSlot];
   }

    public boolean checkHospitalSchedule (int appointmentSlot) {
        return ((hospitalSchedule[appointmentSlot]).equals("open"));
    }

    public void setHospitalAppointment (int appointmentSlot, String nameVendor) {
       hospitalSchedule[appointmentSlot] = nameVendor;
    }


    public Hospital createNewHospital(int numOfAppointments, int numOfHospitals,
                                       String nameHospital, String nameDirector) {
        Hospital h1 = new Hospital();
        this.nameDirector=nameDirector;
        this.nameHospital=nameHospital;
        this.hospitalSchedule = new String[numOfAppointments];
        for (int i=0; i < numOfAppointments; i++) {
            hospitalSchedule[i] = "open";
        }
        return h1;
    }
}

主要Class

package com.company;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Locale;
import java.util.Scanner;

public class Main {



    public static void main(String[] args) {

        // Inputting #vendors, #hospitals
        int vendorCounter=1;
        System.out.println("Enter the total number of appointment slots.");
        Scanner myScanner = new Scanner(System.in);
        int numOfAppointments = Integer.parseInt(myScanner.nextLine());
        System.out.println("Enter the total number of hospitals in the draft.");
        int numOfHospitals = Integer.parseInt(myScanner.nextLine());
        ArrayList<Hospital> hospitals = new ArrayList<Hospital>();

        //creating hospitals
        int hospitalCounter = 1;
        while (hospitalCounter <=numOfHospitals) {
            System.out.println("Enter the name of hospital #" + hospitalCounter);
            String currentHospitalName = myScanner.nextLine().toLowerCase(Locale.ROOT).trim();
            System.out.println("Enter the director's name for " + currentHospitalName + ".");
            String currentDirectorName = myScanner.nextLine().toLowerCase(Locale.ROOT).trim();
            Hospital h1 = new Hospital();
            h1.createNewHospital(numOfAppointments, numOfHospitals, currentHospitalName, currentDirectorName);
            hospitals.add(h1);
            hospitalCounter++;
        }

        //creating vendors
        ArrayList<Vendor> vendors = new ArrayList<Vendor>();
        Scanner myInput = new Scanner(System.in);
        while (vendorCounter != 2000){
            System.out.println("Are you entering a new vendor? Enter Yes or No");
            String isAddingNewVendor;
            isAddingNewVendor= myScanner.nextLine();
            if (isAddingNewVendor.equalsIgnoreCase("yes"))
            {
                System.out.println("Enter the name of the salesperson.");
                String salespersonName = myInput.nextLine();
                System.out.println("Enter the company name for "+salespersonName+".");
                String vendorCompanyName = myInput.nextLine();
                Vendor v1 = new Vendor();
                v1.createNewVendor(vendorCounter, numOfAppointments, numOfHospitals,salespersonName,vendorCompanyName);
                vendors.add(v1);
                vendorCounter++;
            }
            else vendorCounter = 2000;



        }
       /* System.out.println(vendors.get(0).vendorCompanyName);
       System.out.println(hospitals.get(0).nameHospital);
       System.out.println(vendors.get(0));
       vendors.get(0).printVendorSchedule();
       vendors.get(0).printVendorPicks();
       hospitals.get(0).printHospitalSchedule();
      if (vendors.get(0).checkVendorSchedule(0)) {
          System.out.println ("This appointment slot is open for the vendor.");
        }
      if (hospitals.get(0).checkHospitalSchedule(0)) {
          System.out.println("This appointment slot is open for the hospital.");
      }*/

        for (int i = 0; i < numOfHospitals; i++) {
            System.out.println("Information for hospital #" + i);
            System.out.println("Hospital name: " +hospitals.get(i).nameHospital);
            System.out.println("Director's name: " + hospitals.get(i).nameDirector);
            System.out.println("The hospital's initial schedule:");
            hospitals.get(i).printHospitalSchedule();
        }

        for (int i = 0; i < vendors.size(); i++) {
            System.out.println("Information for vendor #" + i);
            System.out.println("Salesperson's name: "+vendors.get(i).salespersonName);
            System.out.println("Company name: " + vendors.get(i).vendorCompanyName);
            System.out.println("The vendor's hospital choices:");
            vendors.get(i).printVendorPicks();
            System.out.println("The vendor's initial schedule:");
            vendors.get(i).printVendorSchedule();
        }


        //draft loop logic
        int draftRound = 1;
        while (draftRound <= numOfAppointments) {
            if (draftRound % 2 == 1) {
                //insert code for odd-numbered draft rounds here.
                //these rounds should start with picker 1, then 2, 3, etc.

                int currentVendor = 0;        //starts this round with the first vendor
                while (currentVendor < vendors.size()){
                    //this while loop continues running through a single draft round until all vendors get a pick
                    int currentAppointmentSlot = 0;
                    int currentVendorPickSlot=0;
                    while (currentVendorPickSlot < numOfHospitals) {      //this loops through a single vendor until all appointments checked or appt assigned
                        //check if hospital and vendor are both open
                        String currentHospital = vendors.get(currentVendor).vendorPicks[currentVendorPickSlot];
                        System.out.println(currentHospital);
                        int currentHospitalsIndex = hospitals.indexOf(currentHospital);  //indexof is returning -1 creating the exceptionoutofbounds
                        System.out.println("Current hospital index:"+ currentHospitalsIndex);
                        if ( hospitals.get(currentHospitalsIndex).checkHospitalSchedule(currentAppointmentSlot) != vendors.get(currentVendor).checkVendorSchedule(currentAppointmentSlot)) {
                            currentAppointmentSlot++;

                        }
                        else {
                            vendors.get(currentVendor).setVendorAppointment(currentVendorPickSlot, hospitals.get(currentHospitalsIndex).nameHospital);
                            hospitals.get(currentHospitalsIndex).setHospitalAppointment(currentVendorPickSlot, vendors.get(currentVendor).salespersonName);
                            break;   // does this break the loop?
                        }
                    }

                    currentVendor++;
                }

                draftRound++;


            }
            if (draftRound % 2 == 0) {
                //insert code for even-numbered draft rounds here.
                //these rounds should start with the last picker and go down by 1 each turn until 1st picker.
                int currentVendor = vendors.size()-1;       //starts this draft round with the last vendor
                while (currentVendor >= 0) {
                    //this while loop continues running through a single draft round until all vendors get a pick
                    int currentAppointmentSlot = 0;                   //looping through the hospital choices for a single vendor
                    int currentVendorPickSlot=0;
                    while (currentVendorPickSlot < numOfHospitals) {
                        //check if hospital and vendor are both open
                        String currentHospital =  vendors.get(currentVendor).vendorPicks[currentVendorPickSlot];
                        int currentHospitalsIndex = hospitals.indexOf(currentHospital);
                        if (hospitals.get(currentHospitalsIndex).checkHospitalSchedule(currentAppointmentSlot) != vendors.get(currentVendor).checkVendorSchedule(currentAppointmentSlot)) {
                            currentAppointmentSlot++;
                            //continuing the loop if the appointment slot doesn't work
                        }
                        else {
                            vendors.get(currentVendor).setVendorAppointment(currentAppointmentSlot, hospitals.get(currentHospitalsIndex).nameHospital);
                            hospitals.get(currentHospitalsIndex).setHospitalAppointment(currentAppointmentSlot, vendors.get(currentVendor).salespersonName);
                            currentVendor++;
                            break;   // does this break the loop?
                        }
                    }

                    currentVendor++;
                }

            draftRound++;
            }
            else break;

        }

        for (int i = 0; i < numOfHospitals; i++) {
            System.out.println("Information for hospital #" + i);
            System.out.println("Hospital name: " +hospitals.get(i).nameHospital);
            System.out.println("Director's name: " + hospitals.get(i).nameDirector);
            System.out.println("The hospital's final schedule:");
            hospitals.get(i).printHospitalSchedule();
        }

        for (int i = 0; i < vendors.size(); i++) {
            System.out.println("Information for vendor #" + i);
            System.out.println("Salesperson's name: "+vendors.get(i).salespersonName);
            System.out.println("Company name: " + vendors.get(i).vendorCompanyName);
            System.out.println("The vendor's final schedule:");
            vendors.get(i).printVendorSchedule();
        }

    }}

首先使用流我们将遍历医院列表,

从列表中找出名字等于currentHospital的医院,用findFirst取出第一个结果。

由于结果可能可用也可能不可用,因此 returns 可选。 所以在 Optional 上,我们会说如果它(我们正在寻找的医院对象)存在,我们将使用 get 方法

将医院从中移除
Optional<Hospital> result = hospitals.stream().filter(h -> h.nameHospital.equals(currentHospital)).findFirst();

if(result.isPresent()){
    Hospital hospital = result.get();
}