有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

关于堆栈溢出还有很多其他类似的问题,但这一个问题的要求与其他问题不同。我想知道如何在不重复的情况下,将一个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) 个答案

  1. # 1 楼答案

    java是一种面向对象语言,因此我认为考虑问题可能包含的对象是有用的。p>

    有一件事会立即跳出你的问题领域,那就是三重整数集,那么为什么不把它定义为一个对象呢

    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框架中使用实例而不用担心。现在让我们使用集合框架:

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