У меня проблемы с возвратом объекта из родительского ArrayList - PullRequest
0 голосов
/ 03 мая 2019

У меня есть 4 класса (я буду сокращать их для удобства).

public class PoliceStation{
public String name;
 ArrayList<Owner> owners = new ArrayList<>();

public boolean addOwner(Owner owner) {
        if(findOwnerID(owner)) {
            this.owners.add(owner);
            System.out.println("Owner "+owner.getName()+" added.");
            return true;
        }
        System.out.println("Owner "+owner.getName()+" with "+owner.getOwnerIDNumber()+" not added.");
        return false;
    }

и еще несколько классов для поиска объектов-владельцев.

И Owner class:

import java.util.ArrayList;
public class Owner {
    String name;
    String dateOfBirth;
    long ownerIDNumber;
    String address;
    ArrayList<Vehicle> vehicles=new ArrayList<Vehicle>();
    ArrayList<Fine> penalties = new ArrayList<Fine>();
public Vehicle findVehicleObject(String plateNum) {
    for(int i=0;i<vehicles.size();i++) {
        System.out.println(i);
        if(vehicles.get(i).getPlateNumber().equalsIgnoreCase(plateNum)) {
            System.out.println("Vehicle with that plate number "+plateNum+" exists.");
            return vehicles.get(i);
        }
    }
    System.out.println("Vehicle doesnt exist with "+plateNum);
    return null;
}

, который состоит из методов addVehicle, findVehicle и т. Д.

Класс автомобиля:

public class Vehicle extends Owner{
    PoliceStation ps = new PoliceStation("center");

    String plateNumber;
    String name;
    String type;
    //String serialNum;

    public Vehicle(String driverName, String dateOfBirth,long ownerID, String address,String plateNumber, String name, String type) {
        super(driverName,dateOfBirth,ownerID,address);
        this.plateNumber = plateNumber;
        this.name = name;
        this.type = type;
    }

С методом findVehicle, который должен возвращать объект транспортного средства с номером машины:

public Vehicle findVehicle1(String plateNum) {
    if(this.plateNumber==plateNum) {
        System.out.println("Lookin "+plateNum);
        return super.findVehicleObject(plateNum);
    }else return null;
}

И после этого у меня четвертый класс с именемRadioCam, который читает plateNumber из машины: (примечание: следующий код написан плохо, потому что я пытался заставить его работать безуспешно)

class RadioCam{
public void detection(double speed) {
    System.out.println("Vehicle detected.");
    //speed would be a variable that the radioCam would return using radiowaves and doppler effect
    if(speed>50) {
        String plateNumber = takePicture();
        Vehicle veh = new Vehicle(plateNumber);
        veh = veh.findVehicle1(plateNumber);//<-- null
        System.out.println("-------------------"+veh.getName());//<- null here as well
        Owner ownerFine = ps.getOwner(veh);
        ownerFine= ps.getOwner(veh);
        System.out.println("sssssss"+ownerFine.getName());
        //ownerFine = PoliceStation.getOwner(veh);
        ps.addFine(ownerFine, "speed violation", veh);//<- so this method doesnt work in the end becuse ownerFine and veh are null

, который возвращает ноль veh = veh.findVehicle1(plateNumber);.И возвращаясь к классу Владельца в public Vehicle findVehicleObject(String plateNum) { for(int i=0;i<vehicles.size();i++) { <- vehicle.size () равен 0, так что он не проходит через транспортные средства вообще.Я понял, что мне нужен объект владельца из массива, чтобы добраться до объекта транспортного средства из массива, но в этом случае мне нужен объект транспортного средства из plateNumber (который является частью класса Vehicle) и из объекта транспортного средства, чтобы получитьобъект владельца, которому принадлежит объект транспортного средства. </p>

Надеюсь, я достаточно хорошо объяснил свои проблемы.

Ответы [ 2 ]

0 голосов
/ 03 мая 2019

В вашем методе findVehicle1(String plateNum) вы сравниваете две строки с оператором ==, в то время как вы должны использовать string.equals (Object other)

Попробуйте изменить

 if(this.plateNumber==plateNum) {

до

 if(this.plateNumber.equals(plateNum)) {

Кроме того, при создании объекта транспортного средства вы пропускаете много необходимых параметров

public Vehicle(String driverName, String dateOfBirth,long ownerID, String address,String plateNumber, String name, String type) {

^ конструктор запрашивает 7 параметров, в то время как вы даете только

new Vehicle(plateNumber);

один параметр. Поэтому, конечно, ваш метод veh.getName() вернет ноль, потому что это атрибут, который вы не поддерживали при создании объекта транспортного средства.

После исправления этих проблем вы можете подумать о своей общей структуре кода, например, о том, где реализовывать циклы и тому подобное.

Я не знаю, используете ли вы IDE, но если вы все же это сделаете, пожалуйста, ознакомьтесь с функциональностью отладки, чтобы шаг за шагом следить за выполнением кода в вызываемых методах. Вы могли бы легко определить строки кода, которые действуют так, как они не должны действовать (ведь вы уже нашли строки, в которых null является результатом вызовов вашего метода).

0 голосов
/ 03 мая 2019

Для сравнения значений используйте метод equals, this.plateNumber==plateNum может быть ложным, даже если они имеют одинаковое значение.

public Vehicle findVehicle1(String plateNum) {
    if(this.plateNumber.equals(plateNum)) {
        System.out.println("Lookin "+plateNum);
        return super.findVehicleObject(plateNum);
    }else return null;
}

...