Java将Int数组的所有排列放入另一个数组而不重复

时间:2015-07-07 19:54:11

标签: java permutation

Stack Overflow还有很多其他问题,但是这个问题要求与其他问题不同。我想知道如何获取int数组的所有排列,没有重复,并将它们放在另一个2D数组中。例如,输入:     {1,2,3} 输出:

{1,2,3}
{1,3,2}
{2,1,3}
{2,3,1}
{3,1,2}
{3,2,1}

我怎样才能做到这一点?我只想简单地谈谈如何做到这一点,甚至更好一些代码。我的问题与this one不同 因为链接的使用C ++函数来完成此任务。我使用Java。

由于

1 个答案:

答案 0 :(得分:2)

Java是一种面向对象的语言,因此我认为考虑问题可能包含哪些对象很有用。

立即跳出问题域的一件事是整数的三重组,所以为什么不把它定义为一个对象:

public class Triad {

    private final int[] components;

    public Triad(int... numbers) {
        this.components = numbers;
        if (components.length != 3) throw new IllegalArgumentException();
    }

    @Override public boolean equals(Object ob) {
        if (ob == this) return true;            
        if (!(ob instanceof Triad)) return false;
        Triad test = (Triad) ob;
        return Arrays.equals(this.components, test.components);
    }

    @Override public int hashCode() {
        return Arrays.hashCode(this.components);
    }
}

请注意,Triad定义了equals()方法和hashCode()方法。这有几个原因很重要。 Triad值类,即Triad的实例代表值而不是活动的值。值类通常是:

  • 应该是不可变的(因为到目前为止我们已经定义了Triad,它是不可变的)
  • 具有格式良好的equals()和hashCode()方法

上面的最后一个属性允许在不收集Java Collections Framework的情况下使用实例。现在让我们使用Collections Framework:

public static void main(String[] args) {

    Set<Triad> triads = new HashSet<Triad>();

    Triad inputTriad;

    while (true) {
        int[] numbers = ... // read in data from some source
        if (numbers == null) break;
        inputTriad = new Triad(numbers);
        triads.add(inputTriad);
    }

    // after the loop has completed, the HashSet instance triad will contain
    // all your input triads.  The contract of HashSet guarantees that there
    // will be no duplicates.
    :
    :
}

如果必须在int数组中得到结果,现在迭代HashSet实例并将每个元素的组件值分配给结果数组是一件简单的事情。