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。
由于
答案 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
的实例代表值而不是活动的值。值类通常是:
上面的最后一个属性允许在不收集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实例并将每个元素的组件值分配给结果数组是一件简单的事情。