在Java中返回一对值的最佳方法是什么?

时间:2011-06-07 21:12:13

标签: java data-structures

这是一个小问题,因为我可以轻松地掀起一对班级来完成这项工作。我不是真的想这样做,我觉得应该有一些简单的,内置的,类似java的方式返回两个值。你们这是最好,最简单的方法吗?阵列?其他一些数据结构?

8 个答案:

答案 0 :(得分:33)

据我所知,遗憾的是,Java中没有一对内置表示(我当然希望有)。就个人而言,当我编写一个项目,我发现一个对类通常会很有用时,我创建了一个通用的Pair<T, U>类(这可能就是你想到的)。返回数组是一种快速而简单的方法,但您可能会后来后悔,因为使用您的方法的人会想知道该方法是否可能在某些时候返回两个以上的值。

无论您选择哪种解决方案:只要您认为自己需要配对,就应该考虑使用例如今天节省的时间。一般的Pair类确实值得向下一个阅读代码的人丢失信息(这个人可能在六个月内成为你)。为返回类型编写单独的类现在需要更多时间,但它会向使用您的方法的人传达更多信息(即,它告诉用户返回值表示什么,并包含两个值的有用成员名称)。但是,如果它是一个仅使用少数几个地方的非公共方法,则更容易接受。

答案 1 :(得分:29)

使用容器类是最简单的方法。

 public class Pair<T, U> {         
    public final T t;
    public final U u;

    public Pair(T t, U u) {         
        this.t= t;
        this.u= u;
     }
 }

答案 2 :(得分:13)

我在标准库中看到的最接近“对”的是Map.Entry接口以及实现它的AbstractMap.SimpleEntryAbstractMap.SimpleImmutableEntry类。

如果两个对象都是同一个类,则数组更容易使用。

答案 3 :(得分:3)

Apache Commons Lang3提供了一个抽象的Pair类,其中包含一些实现,包括ImmutablePair和MutablePair。

答案 4 :(得分:2)

三种方法,都不是很好:

  1. 滚动您自己的Pair<A, B>。你说你不想这样做。
  2. 返回Object[]。这不是类型安全的。
  3. 通过提供单个元素数组作为参数来模拟输出变量指针
  4. #3的一个例子:

    public boolean getUserDetails(String userId, String[] lastName, String[] firstName, Date[] dob) {
      assert lastName  != null && lastName.length  == 1;
      assert firstName != null && firstName.length == 1;
      assert dob       != null && dob.length       == 1;
      ...
    }
    

    第三种选择让来电者的生活变得痛苦。

    就像我说的那样,没有好的解决方案。

    另外,Scala使用各种Tuple类(从我记忆中最多21元组)来帮助你解决这个问题。

答案 5 :(得分:0)

如果两者都是整数,那么我会建议java.awt.Point,否则只需创建一个包含两个对象x和y的容器类

答案 6 :(得分:0)

专家告诉我,当面对成对问题时,有两件事情是真的:

  1. 你需要重新思考你的结构(这个直言不讳的答案对任何人都没有帮助)
  2. 你需要建立自己的班级来保持这对
  3. 我建议第二种情况并非完全不正常。但是,如果您所做的事情对于引入新课程似乎过于微不足道,那么使用Map 可以工作,正如其他人所建议的那样。如果您只是回发一个回复,那么Map似乎有点多了。

    如果对的列表听起来像是可行的,并且您需要维护订单,则可以尝试LinkedHashMap以便维护订单。

答案 7 :(得分:0)

对我的一些观察:

  1. 虽然不可能扩展其容量,但是数字内置,快速且易于使用。如果您想在3个月后返回3个值,该怎么办?

  2. ArrayList /其他集合可以很好,允许你增加容量(最初为10)。 请注意,当您只想存储稍后要提取的2个值时,与ArrayList相比,Vector可能过度。地图也可以很好,因为它总是排序和排序。

  3. 一些用户定义的类:如果有意义可能是一个选项(意味着返回的数据很重要 - 是一个Java Bean),并且你想要存储多于2个整数。如果您在其Javadoc中添加更多注释,则可读性更好。可以根据需要进行扩展,只需在此类中添加字段即可。更慢,但更安全。