gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 04:32:22 24 4
gpt4 key购买 nike

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。

谢谢

最佳答案

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 的实例代表值而不是 Activity 的东西。通常值类别:

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

上面的最后一个属性允许使用 Java 集合框架而无需担心的实例。现在让我们使用集合框架:

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 实例并将每个元素的组件值分配给结果数组。

关于Java将一个Int数组的所有排列放入另一个数组中而不重复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31278095/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com