Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java置换2_Java - Fatal编程技术网

Java置换2

Java置换2,java,Java,大约一周前,我问了一个关于帮助我解决这个问题的问题 ,打印排列方法中存在问题。我整理了我的代码,有一个工作示例,现在可以工作了,尽管如果5在数组中的第5位,它不会打印它。任何帮助都将不胜感激 package permutation; public class Permutation { static int DEFAULT = 100; public static void main(String[] args) { int n = DEFAULT; if (args.l

大约一周前,我问了一个关于帮助我解决这个问题的问题

,打印排列方法中存在问题。我整理了我的代码,有一个工作示例,现在可以工作了,尽管如果5在数组中的第5位,它不会打印它。任何帮助都将不胜感激

 package permutation;

public class Permutation {

static int DEFAULT = 100;

public static void main(String[] args) {
    int n = DEFAULT;
    if (args.length > 0)
        n = Integer.parseInt(args[0]);
    int[] OA = new int[n];
    for (int i = 0; i < n; i++)
        OA[i] = i + 1;
    System.out.println("The original array is:");
    for (int i = 0; i < OA.length; i++)
        System.out.print(OA[i] + " ");
    System.out.println();
    System.out.println("A permutation of the original array is:");
    OA = generateRandomPermutation(n);
    printArray(OA);
    printPermutation(OA);
}

static int[] generateRandomPermutation(int n)// (a)
{
    int[] A = new int[n];
    for (int i = 0; i < n; i++)
        A[i] = i + 1;
    for (int i = 0; i < n; i++) {
        int r = (int) (Math.random() * (n));
        int swap = A[r];
        A[r] = A[i];
        A[i] = swap;
    }
    return A;
}

static void printArray(int A[]) {
    for (int i = 0; i < A.length; i++)
        System.out.print(A[i] + " ");
    System.out.println();
}

static void printPermutation(int[] p)

{
    int n = p.length-1;
    int j = 0;
    int m;
    int f = 0;

    System.out.print("(");
    while (f < n) {
        m = p[j];
        if (m == 0) {
            do
                f++;
            while (p[f] == 0 && f < n);
            j = f;
            if (f != n)
                System.out.print(")(");
        } 
        else {
            System.out.print(" " + m);
            p[j] = 0;
            j = m - 1;
        }
    }
    System.out.print(" )");
}
}
包置换;
公共类置换{
静态int默认值=100;
公共静态void main(字符串[]args){
int n=默认值;
如果(args.length>0)
n=整数.parseInt(args[0]);
int[]OA=新的int[n];
对于(int i=0;i
我不太喜欢

int n = p.length-1;

while (f < n) {
while(f

因此,如果p是5个单位长,f从0开始,那么循环将从0到3。这似乎排除了数组中的最后一个元素。

可以使用Collections类的shuffle方法

Integer[] arr = new Integer[] { 1, 2, 3, 4, 5 };
List<Integer> arrList = Arrays.asList(arr);
Collections.shuffle(arrList);
System.out.println(arrList);
Integer[]arr=新的整数[]{1,2,3,4,5};
List arrList=Arrays.asList(arr);
集合。洗牌(arrList);
系统输出打印项次(arrList);

我不认为将每个元素与另一个随机元素交换将得到统一的排列分布。最好从剩余值中统一选择:

Random rand = new Random();
ArrayList<Integer> remainingValues = new ArrayList<Integer>(n);
for(int i = 0; i < n; i++)
    remainingValues.add(i);
for(int i = 0; i < n; i++) {
    int next = rand.nextInt(remainingValues.size());
    result[i] = remainingValues.remove(next);
}
Random rand=new Random();
ArrayList remainingValues=新的ArrayList(n);
对于(int i=0;i

请注意,如果需要考虑运行时间的顺序,则使用此容量的ArrayList是n平方时间。有一些数据结构可以在n log n时间内处理此任务,但它们非常重要。

这并不能解决您确定的问题

相反,我认为它识别了GeneratorDomainPermutation(intn)过程中的错误

如果您添加生成的随机数的打印输出(如下所示),并运行该过程几次,那么我们就可以检查数组中要排列的所有元素是否都是随机选择的

static int[] generateRandomPermutation(int n)
{
    int[] A = new int[n];
    for (int i = 0; i < n; i++)
        A[i] = i + 1;
     System.out.println("random nums generated are: ");
    for (int i = 0; i < n; i++) {
        int r = (int) (Math.random() * (n));
         System.out.print(r + " ");
static int[]generateRandomPermutation(int n)
{
int[]A=新的int[n];
对于(int i=0;i
运行该进程几次。 你看到我看到的了吗


Jerry.

如果我将其更改为int n=p.length,它会返回一个错误。这是我的问题,它直到最后一个元素才读取,虽然试图跟踪错误所在,但我找不到它。这很公平。你是否使用调试器检查过例程,看看哪里出错了?出现了什么错误?线程中出现异常“main”java.lang.ArrayIndexOutofBounds异常:5在permutation.permutation.printPermutation(permutation.java:58)在permutation.permutation.main(permutation.java:21)所以它基本上用完了数组的长度。虽然在这种情况下,如果它在第五个位置,它会打印5,但不是最后一个括号,更改长度可以消除错误,也可以消除最后一个数字。为什么不以打印原始数组的相同方式打印排列?排列将保留在精确的sa中我有点像数组。它的家庭作业,我必须使用命令式(?)方法,尽管那样会简单得多。