Как написать метод, который возвращает объект и целое число? - PullRequest
1 голос
/ 23 апреля 2020

Работаю над проектом, в котором я делаю ИИ, который может успешно играть в c человек. У меня есть метод, который получает специфицированный призрак c и расстояние от человека-па c, но я могу только вернуть указанный призрачный объект c или расстояние от него до человека па c, когда мне нужно оба значения, чтобы продолжить. Мое текущее решение в основном имеет два метода, которые абсолютно одинаковы, но с разными именами и разными возвращаемыми значениями: один объект и один тип int.

Пример

public Ghost closestDefender1()
{
code

return Ghost;
}

public int closestDefender2()
{
code

return int;
}

Опять же, код в обоих методах абсолютно одинаков.

Есть ли более эффективный способ?

Ответы [ 7 ]

1 голос
/ 23 апреля 2020

В чистом OOP вы не можете реально установить значение, потому что вы инициализируете некоторые значения, а затем вызываете метод для вычисления чего-либо с этими значениями. Так что подумайте о том, чтобы позволить объекту Ghost вычислять значение целого числа, если вам нужно придерживаться кода, который изменяет целое число в функции closestDefender, тогда рассмотрите возможность установки целого числа в объект Ghost, а затем только возвращайте его, чтобы вы не нужно иметь две функции с точно таким же кодом, но возвращающие разные вещи.

0 голосов
/ 23 апреля 2020

Я исправил свою проблему, сделав свой метод "publi c stati c Object []", я заставил мой метод возвращать массив объектов и инициализировал [0] как объект-призрак и [1] как целое число

0 голосов
/ 23 апреля 2020

Если ваш класс данных не может возвращать более одного значения из метода, вы можете вернуть массив, список или карту, содержащие объекты, которые затем преобразуются в то, что вы знаете.

import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class Test {

    public static void main(String[] args) {

        Map<Integer, Object> myResult = myMethod();

        Integer myInteger = (Integer) myResult.get(1);

        System.out.println("1st value: " + myInteger);

        Date myDate = (Date) myResult.get(2);

        System.out.println("2nd value: " + myDate);

        String myString = (String) myResult.get(3);

        System.out.println("3rd value: " + myString);

        List<Object> myResultB = myMethodB();

        myInteger = (Integer) myResultB.get(0);

        System.out.println("1st value: " + myInteger);

        myDate = (Date) myResultB.get(1);

        System.out.println("2nd value: " + myDate);

        myString = (String) myResultB.get(2);

        System.out.println("3rd value: " + myString);

        Object[] myResultC = myMethodC();

        myInteger = (Integer) myResultC[0];

        System.out.println("1st value: " + myInteger);

        myDate = (Date) myResultC[1];

        System.out.println("2nd value: " + myDate);

        myString = (String) myResultC[2];

        System.out.println("3rd value: " + myString);
    }

    static Map<Integer, Object> myMethod() {

        Map<Integer, Object> result = new HashMap<>();

        result.put(1, Integer.valueOf(100));

        result.put(2, new Date());

        result.put(3, "Test");

        return result;
    }

    static List<Object> myMethodB() {

        List<Object> result = new ArrayList<>();

        result.add(Integer.valueOf(100));

        result.add(new Date());

        result.add("Test");

        return result;
    }

    static Object[] myMethodC() {

        Object[] result = new Object[3];

        result[0] = Integer.valueOf(100);

        result[1] = new Date();

        result[2] = "Test";

        return result;
    }

}
0 голосов
/ 23 апреля 2020

Вы можете создать свой собственный класс, который расширяет класс Number и реализует интерфейс.

public class NumericObject extends java.lang.Number implements AnInterface {

}

Теперь вы можете использовать его либо как Number, либо как AnInterface* 1007. *

public NumericObject closestDefender() {

}

// all are fine
Number closestDefender = closestDefender();
AnInterface closestDefender = closestDefender();
NumericObject closestDefender = closestDefender();
0 голосов
/ 23 апреля 2020

Я предполагаю, что ваш объект-призрак содержит некоторые координаты для его положения, и я предполагаю, что вы используете эти координаты для вычисления расстояния между Pa c -Man и Ghost ...

Так что, возможно, создайте функцию для получения ближайшего призрака. Затем создайте функцию для вычисления расстояния от Pa c -Man до любого произвольного Призрака.

Примерно так:

public Ghost getClosestGhost() {
    // Find Closest Ghost...
    return closestGhost;
}

public int getDistanceFromGhost(Ghost g) {
    // Calculate Distance from g using its coordinates.
    return distance;
}

Чтобы использовать этот код, нам просто нужно запустить следующее ...

Ghost closest = getClosestGhost();
int distanceFromClosest = getDistanceFromGhost(closest);

При таком решении код не должен повторяться. Вы даже можете использовать getDistanceFromGhost в своей функции getClosestGhost.

0 голосов
/ 23 апреля 2020

Вы можете сделать это так. Просто объявите специальный класс для возврата и Object, и int. Используя универсальные шаблоны, вы можете поддерживать любой тип объекта, который способен обработать метод.

Любое значение будет доступно для соответствующего доступа.

    public <T> MyObject<T> method() {
           // do something
          T ob = null;  // or some object value
          int x = 10;
          return new MyObject<>(ob, x);
    }

    class MyObject<T> {
         public T object;
         public int v;
         public MyObject(T o, int v) {
             this.v = v;
             this.object = o;
         }
    }
0 голосов
/ 23 апреля 2020

У вас не может быть одного метода для возврата объектов двух типов. Но вместо того, чтобы иметь избыточный код в двух местах, создайте метод для выполнения обработки.

public Ghost closestDefender1()
{
    somefunction();
    return Ghost;
}

public int closestDefender2()
{
    somefunction();
    return int;
}

Здесь somefunction () выполнит необходимую обработку и позволит методам определить тип возвращаемого значения.

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