Проблема с массивами, которые используют для циклов и если (JAVA) - PullRequest
0 голосов
/ 03 декабря 2018

я пытаюсь выяснить, как заставить цикл for искать во всех массивах (я думаю, проблема в цикле for с именем "z" или в операторе if), но он продолжает искать только в первом изатем он переходит к оператору else, если первый город не равен cityName

Заранее спасибо.

public String citiesNorthOf(String cityName)
    {
        String northOfCities = null;
        for(int z = 0 ; z < _noOfCities-1 ; z++)
        {
            if(_cities[z].getCityName().equals(cityName))
            {
                for(int a = 0 ; a < _noOfCities-1 ; a++)
                {

                    Point city1 = _cities[z].getCityCenter();
                    Point otherCity = _cities[a].getCityCenter();
                    if(city1.isUnder(otherCity))
                    {
                        northOfCities = _cities[a].getCityName();
                        System.out.println(northOfCities);
                    }
                    if(northOfCities.equals(null))
                    {
                        String noCitiesNorth = "There is no cities north of "+cityName;
                        return noCitiesNorth;
                    }
                }
            }   

            else
            {
                String noCity = "There is no city with the name: " +cityName;
                return noCity;
            }
        }

        return northOfCities;
    }

Ответы [ 4 ]

0 голосов
/ 03 декабря 2018

Пара вещей:

1.для границ

Петли определены как for(int z = 0 ; z < _noOfCities-1 ; z++) (то же самое для a).Похоже, последний Citi не обрабатывается.Если имеется 10 городов, а первый - 0, последним будет 9. Число городов минус один - 9, поэтому, когда z равно 9, а 9 <9 ложно, оно не будет обработано. </p>

2.northOfCities роль не ясна

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

3.Null оценка

Этот раздел кода, по-моему, должен находиться вне цикла переменных a.Таким образом, он оценивается после оценки всех возможных совпадений.Когда цикл завершается, имеет смысл посмотреть, равна ли переменная null, то есть не найдено ни одного совпадения.Кроме того, если переменная null, вызов equals() выдаст NPE, поэтому замените его на ==.

        if(_cities[z].getCityName().equals(cityName))
        {
            for(int a = 0 ; a < _noOfCities-1 ; a++)
            {

                Point city1 = _cities[z].getCityCenter();
                Point otherCity = _cities[a].getCityCenter();
                if(city1.isUnder(otherCity))
                {
                    northOfCities = _cities[a].getCityName();
                    System.out.println(northOfCities);
                }
            }
            if(northOfCities == null){
                    String noCitiesNorth = "There is no cities north of "+cityName;
                    return noCitiesNorth;
            }
        }  

EDIT I ​​

Со следующими изменениями код должен запускать печать городов к северу от заданного города.Метод возвращает имя последнего найденного города или сообщение об ошибке, указывающее, не найден ли город, или нет ли городов на севере.Я должен был предположить, что у вас есть класс Citi, если не просто заменить имя класса типом элементов, хранящихся в массиве _cities.

Дальнейшие улучшения : вы можете изменить методвернуть коллекцию всех найденных городов и выдать исключения для разных ошибок.

public String citiesNorthOf(String cityName){
        String northOfCities = null; //Return value
        City citi = null;
        for(int z = 0 ; z < _noOfCities; z++){
            if(_cities[z].getCityName().equals(cityName)){
                citi = _cities[z];
                for(int a = 0 ; a < _noOfCities ; a++){  
                    Point cityCenter = citi.getCityCenter();
                    Point otherCityCenter = _cities[a].getCityCenter();
                    if(cityCenter.isUnder(otherCityCenter)){
                        northOfCities = _cities[a].getCityName();
                        System.out.println(northOfCities);
                    }
                }
                if(northOfCities == null){
                        northOfCities = "There is no cities north of "+cityName;
                }
            }   
        }
        if(citi == null){
              northOfCities = "There is no city with the name: " +cityName;
        }
        return northOfCities;
    }
0 голосов
/ 03 декабря 2018

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

То, что вы , вероятно, после того, что вам нужно будет установить флаг в false в блоке else.Как только этот цикл выполняется, вы проверяете, чтобы увидеть статус этого флага.Если значение равно false, вы выполняете код, который в данный момент находится в вашем разделе else.

Аналогичная проблема возникнет в следующем разделе: if(northOfCities.equals(null)).Однако я не уверен, что именно такое поведение вы намереваетесь.

РЕДАКТИРОВАТЬ: Это более или менее то, что я имел в виду:

public String citiesNorthOf(String cityName)
    {
        String northOfCities = null;
        for(int z = 0 ; z < _noOfCities-1 ; z++)
        {
            if(_cities[z].getCityName().equals(cityName))
            {
                for(int a = 0 ; a < _noOfCities-1 ; a++)
                {

                    Point city1 = _cities[z].getCityCenter();
                    Point otherCity = _cities[a].getCityCenter();
                    if(city1.isUnder(otherCity))
                    {
                        return _cities[a].getCityName();    //If we find what we are looking for, we return the name of the city.
                    }
                    if(northOfCities.equals(null))
                    {
                        return "There is no cities north of "+cityName;   //If we find our city, but we also find that there is nothing North of it, we return this error message.
                    }
                }
            } 
        }
        return "There is no city with the name: " +cityName;  //If the for loop has executed and none of the previous return statements have been executed, then, it follows that there is no city with the given name, so we return this error.
    }
0 голосов
/ 03 декабря 2018

Если ваше выполнение переходит к этой части кода, это приведет к завершению функции из-за возврата:

if(northOfCities.equals(null))
{
    String noCitiesNorth = "There is no cities north of "+cityName;
    return noCitiesNorth;
}

То же самое для этой части:

else
{
    String noCity = "There is no city with the name: " +cityName;
    return noCity;
}

Заменить элементы return элементами break или continue

0 голосов
/ 03 декабря 2018

Вы должны использовать операторы "break" вместо операторов "return", если вы хотите обработать все элементы массива, потому что "return" приведет к немедленному завершению и возврату метода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...