是否可以在一次通话中退回多个项目?

时间:2009-08-21 18:16:26

标签: java

以下元素是否可以在一次调用中返回多个项目(即两个GRects)

    private GObject getColidingObject(){
    if(getElementAt(ball.getX(), ball.getY()) != null){
        return getElementAt(ball.getX(), ball.getY());
    }else if(getElementAt(ball.getX() + BALL_RADIUS *2, ball.getY()) != null){
        return getElementAt(ball.getX() + BALL_RADIUS *2, ball.getY());
    }else if(getElementAt(ball.getX(), ball.getY() + BALL_RADIUS *2) != null){
        return getElementAt(ball.getX(), ball.getY() + BALL_RADIUS *2);
    }else if(getElementAt(ball.getX() + BALL_RADIUS *2, ball.getY() + BALL_RADIUS *2) != null){
        return getElementAt(ball.getX() + BALL_RADIUS *2, ball.getY() + BALL_RADIUS *2);
    }else{
        return null;
    }
}

14 个答案:

答案 0 :(得分:9)

您只能返回一个值,但可以将该值设为数组。例如:

private GObject[] getCollidingObjects() {
    GObject[] ret = new GObject[2];

    ret[0] = ...;
    ret[1] = ...;
    return ret;
}

顺便说一句,当你开始在同一个方法中多次重复使用同一个表达式时,你应该考虑引入一个局部变量以便清楚。例如,请考虑此而不是原始代码:

private GObject getCollidingObject(){
    int x = ball.getX();
    int y = ball.getY();
    if (getElementAt(x, y) != null) {
        return getElementAt(x, y);
    }
    if (getElementAt(x + BALL_RADIUS * 2, y) != null) {
        return getElementAt(x + BALL_RADIUS * 2, y);
    }
    if (getElementAt(x, y + BALL_RADIUS * 2) != null) {
        return getElementAt(x, y + BALL_RADIUS * 2);
    }
    if (getElementAt(x + BALL_RADIUS * 2, y + BALL_RADIUS * 2) != null) {
        return getElementAt(x + BALL_RADIUS * 2, y + BALL_RADIUS * 2);
    }
    return null;
}

(您也可以对x + BALL_RADIUS * 2y + BALL_RADIUS * 2执行相同操作。)

您可能也会考虑这样的事情:

private GObject getCollidingObject(){
    int x = ball.getX();
    int y = ball.getY();
    return getFirstNonNull(getElementAt(x, y),
        getElementAt(x + BALL_RADIUS * 2, y),
        getElementAt(x, y + BALL_RADIUS * 2),
        getElementAt(x + BALL_RADIUS * 2, y + BALL_RADIUS * 2));
}

private static getFirstNonNull(GObject... objects) {
    for (GObject x : objects) {
        if (x != null) {
            return x;
        }
    }
    return null;
}

(在C#中,使用null合并运算符有一种更好的方法,但不要介意......)

答案 1 :(得分:4)

不可以只从通话中返回一个项目。在您发布的代码中,只有一个getElementAt行将执行。

答案 2 :(得分:3)

您是否询问您的函数是否可以返回多个对象?

我认为最简单的方法是在函数中返回List或对象数组。

答案 3 :(得分:2)

像GObject的集合一样?

private List<GObject>getColidingObject(){
    ...
    List<GObject> colidingObjects = new ArrayList<GObject>();
    colidingObjects.add(...);
    return colidingObjects;
}

答案 4 :(得分:1)

您可以返回一个数组或GRect列表。或者,也许提供方法可以填充的空数组或列表。

答案 5 :(得分:1)

只需返回两个GRect的数组。

答案 6 :(得分:1)

是和否。简短的回答并不是你在那里尝试的方式。

如果要返回“两个”内容,可以将它们封装到一个可以作为单个实体返回的对象中。

例如,Map或任何其他集合应该可以解决问题。另外,你可以返回一个数组。

答案 7 :(得分:0)

不。除非有GArray。但正如所写,没有。它将返回一个或“零”(null)对象。

答案 8 :(得分:0)

它将始终返回一个对象。然而,该对象可以是从GObject继承的容器类,其容纳多个对象,例如,一个GCompound

答案 9 :(得分:0)

不,不是。

Java函数只有一个返回值。

如果您确实需要返回多个值,则可以返回列表或值数组,如下所示:

private List<GObject> getColidingObject() {
         List<GObject> results = new ArrayList<GObject>();
         if( cond1() ) {
             results.add( getElementAt( .... ) ;
         } else if( cond2() ) { 
             results.add( getElementAt( .... ) ;
         } else if ( etc ... 

         return results;
}

答案 10 :(得分:0)

如果要返回多个相同类型的项目,则始终可以返回此对象的集合。如果您总是返回两个对象,则数组可能会更好,因为它可以为您提供对对象的快速排序访问。

如果你有很多值并需要返回它们,你可能需要引入一种新类型的对象来存储所有的值然后返回这个对象。这是一个非常好的提示,如果您遇到许多数组,Intergers或者对的列表,您迟早需要此对象在您的应用程序中移动数据。

答案 11 :(得分:0)

是的,但这对于某人在生产环境中维持来说将是一场噩梦。

答案 12 :(得分:0)

简单的答案是“否”,你只能有一个返回值。

但大多数海报都说你可以使用收藏品来回报多件事。我注意到大多数人似乎主张返回一个列表或一个集合对象,它可以正常工作,但是如果你的问题被隔离到你正在开发的特定类中,你也可以考虑定义一个内容的内部类来使你的生活更轻松。这是一个绝对的脑死亡的例子,但希望它能解决这个问题:

public class InnerClassDemo
{
    public static void main(final String[] args)
    {
        InnerClassDemo icd = new InnerClassDemo();

        Holder h = icd.getTwoRandomValues();
        System.out.println("Value 1 = " + h.getVal1());
        System.out.println("Value 2 = " + h.getVal2());
    }

    public Holder getTwoRandomValues()
    {
        Random r = new Random();

        int x = r.nextInt();
        int y = r.nextInt();

        return(new Holder(x,y));
    }

    private class Holder
    {
        private int val1;
        private int val2;

        public Holder()
        {
            this.val1 = 0;
            this.val2 = 0;
        }

        public Holder(int val1,int val2)
        {
            this.val1 = val1;
            this.val2 = val2;
        }

        public int getVal1()
        {
            return this.val1;
        }

        public void setVal1(int val1)
        {
            this.val1 = val1;
        }

        public int getVal2()
        {
            return this.val2;
        }

        public void setVal2(int val2)
        {
            this.val2 = val2;
        }
    }
}

所以在你的情况下,如果一次传递两个GRects,那么只需要创建一个包含几个GRects的内部类,这对你来说是一个常见的操作。

答案 13 :(得分:-2)

一个方法只能有1个返回。一旦找到返回,该方法就会完成它的执行。