Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在java中返回多个整数?_Java_Reference - Fatal编程技术网

如何在java中返回多个整数?

如何在java中返回多个整数?,java,reference,Java,Reference,我有一个方法,它将返回一个错误代码(int)和一个结果(int)。如果错误代码为0,则结果有效。 在C++中,这可能是: int method(int& result); Java通过引用调用,因此如果我们更改方法中的对象,则调用方可以看到更改。但是,int不是一个类,所以我不能在java中这样做: int method(int result); 整数和Long在Java中是不可变的,因此如果我这样做,调用方将看不到更改: Integer method(Integer result)

我有一个方法,它将返回一个错误代码(int)和一个结果(int)。如果错误代码为0,则结果有效。 在C++中,这可能是:

int method(int& result);
Java通过引用调用,因此如果我们更改方法中的对象,则调用方可以看到更改。但是,int不是一个类,所以我不能在java中这样做:

int method(int result);
整数和Long在Java中是不可变的,因此如果我这样做,调用方将看不到更改:

Integer method(Integer result);
将结果包装到包装器类中即可!但是,这并不是那么简单

我最近用C++工作了,最近搬到了java,这让我很烦! 有谁能提供解决方案吗

=================================

总之,有以下流动解决方案:

  • 将数组作为参数传递
  • 将包装器作为参数传递
  • 退一双
  • 返回包含错误号和结果的包装
  • 抛出异常
  • 传递可变整数
  • 第一和第二使我的api难看 第三和第四似乎并不完美 大约5号,这个方法经常被调用,所以我必须考虑效率 第六似乎最符合我的要求

    谢谢

    不是很好,但是:

    int method(int[] result) {
       result[0] = 1; // set result[0] as your out value
       // etc.
    }
    

    使用数组创建一个指向单个int的“人工引用”。

    您需要包装这些值,这是正确的。如果对<代码>方法< /代码>的调用不会太频繁,请考虑抛出异常来报告失败,否则将退出。这将是最具Java风格的方法。我也在C++代码中使用这个模式(我不喜欢用相同的方法输出参数和返回值,除非有其他的压力要求)。 然而,性能有时需要您使用的更C-system-call-ish风格。在这种情况下,我建议您构造一个结果类型和一个可以设置其值的错误类型


    另一个要考虑的是有一个通用的(读取的模板)类,名为“代码> Tootuple < /代码>,您可以使用它来传递对值。我发现,在Java中,我做了很多成对传递,尽管这可能是我个人风格的衍生

    方法不能返回多个整数。您可以做的是:

    • 创建一个包含2个整型字段的新对象,并让您的方法返回该对象的一个实例(基本上是一个包装器)

    • 使您的方法返回2个整数的数组(或将其作为参数)

    • 使您的方法返回形式为
      的字符串变量。然后可以使用从字符串中获取数字并将其解析回整数

    • 使您的方法抛出异常并返回数字


    不要对错误代码使用返回代码:使用异常;这就是他们的目的。只需返回实际结果。

    我建议创建一个自定义对象来保存这两段数据,例如

    public class ResultData {
        private int result;
        private int errorCode;
    
        public ResultData(int errorCode, int result) {
            this.result = result;
            this.errorCode = errorCode;
        }
    
        // Getters...
    }
    
    然后,您的方法变成:

    public ResultData method() {
        // Do stuff
        return new ResultData(error, result);
    }
    

    或者,正如其他答案所建议的那样,使用异常来表示是否发生了错误,这样,如果方法返回结果,您就可以始终确保它是有效的。捕获异常表示发生了错误,您可以用处理错误代码的方式来处理它。

    有两种方法来处理该场景:- 1.为错误代码指定一个特殊值,以将其与结果值区分开来(如果可能的话)。例如,如果元素不在列表中,java的ArrayList中的indexOf()方法返回-1,否则返回正索引。 2.对错误条件使用异常,并始终将返回值视为正确结果。也就是说,如果方法返回时没有任何异常,则假定退出代码为0,并将返回值存储到结果中


    创建一个自定义对象来存储结果和退出代码可能有些过分。

    返回错误代码在Java中不是一个好做法。而是使用异常。。。和多重值列表

    List<Integer> method(Parameter... paramteters)
    {
       List<Integer> listOfValues = ...
    
       //some calculations
    
       if(errorCondition) throw new SomeException();
    
       //more calculations, if needed       
    
       return listOfValues;
    }
    
    列表方法(参数…参数)
    {
    listOfValues=。。。
    //一些计算
    如果(errorCondition)抛出新的SomeException();
    //如果需要,请进行更多计算
    返回值列表;
    }
    
    在您的情况下,如果出现错误,请抛出相应的异常。在C++中也有例外。

    其他任何东西都是有效的结果


    但是,请回答有关如何返回多个值的问题

    我在许多地方使用的一种方法是使用侦听器接口

     interface ErrorOrResult {
        void onError(int error);
        void onResult(int result);
     }
    
     a.method(errorOrResultImpl); // can use an anonymous implementation here.
    
    如您所见,不同类型的结果可以使用各种参数调用任意次数


    可以返回包含两个字段的对象。这是最面向对象的方式

    如果每次都创建一个对象让您感到不安,您可以将一个对象作为参数传递。 最简单的方法是重复使用的
    int[]

     int[] results = { 0, 0 };
    
     a.method(results);
    
    另一种选择是返回一个长的

     long result = a.method();
     // split into two int values.
    
    或者使方法有状态

     int error = a.method();
     int result = a.methodResult();
    
    或者您可以像Collections.binarySearch一样使用符号

     int errorOrResult = a.method();
     if (errorOresult < 0)
        int error = ~errorOrResult;
     else
        int result = errorOrResult;
    
    int errorresult=a.method();
    如果(ErrorResult<0)
    int error=~errorresult;
    其他的
    int结果=错误或结果;
    

    考虑到有这么多备选方案,可能需要一段时间才能允许多个返回值。

    返回一个包含两个整数的对象,例如使用commons lang v3

    Pair方法(){
    返回对(a,b)
    }
    
    库中有一个组件。因为它是可变的,所以您可以通过引用传递它。

    首先,一个
    int
    错误代码?一般认为Java语言很差。异常是常见的(但执行时很慢)。如果它实际上很常见,并且/或者性能很关键,那么返回一些有意义的内容。也许是一个不错的新[2004]枚举

    一般来说,如何返回多个值。您可以破解它并使用
    AtomicInteger
    或类似工具。请不要使用数组

    最好返回一个有意义的(可能是不可变的)对象<代码>对不是一个平均值
    Pair<Integer, Integer> method(){
       return Pair.of(a,b)
    }