Доброго дня!
Java почав вивчати нещодавно, відповідно багато невідомого і багато проблем.
Буду вдячний, якщо хтось зможе допомогти. Власне, далі суть проблеми.
Є код для лексикографічного впорядкування масиву:
▼Прихований текст
/* package whatever; // don't place package name! */
import java.util.*;
import java.lang.*;
import java.io.*;
/* Name of the class has to be "Main" only if the class is public. */
class Ideone
{
public static void main(String[] args)
{
int myArray[] = {1,2,3};
ArrayList<int[]> ArrayOfArrays = new ArrayList<int[]>();
ArrayList<int[]> Arrays1 = new ArrayList<int[]>();
ArrayOfArrays = Recursive(myArray, Arrays1);
for (int i = 0; i < ArrayOfArrays.size(); i++)
{
int m[] = ArrayOfArrays.get(i);
for (int l = 0; l < m.length; l++)
{
if ((l+1) == m.length)
{
System.out.println(m[l]);
}
else
{
System.out.print(m[l] + ", ");
}
}
}
}
public static ArrayList Recursive(int[] myArray, ArrayList<int[]> Arrays1)
{
Arrays1.add(myArray);
int k = myArray.length-1;
for (int i = k; i >= 0; i--)
{
if (i-1 >= 0)
{
if (myArray[i-1] < myArray[i])
{
int[] a = SwapArrayElements(myArray, i-1, i);
Recursive(a, Arrays1);
}
}
}
return Arrays1;
}
public static int[] SwapArrayElements(int[] Array, int n1, int n2)
{
//Елемент n1 потрібно замінити на мінімальний елемент з хвоста (елементи після n1),
//але такий, що є більшим за елемент n1.
int a = Array[n1];
int b = Array[n2];
for (int i = n1+1; i < Array.length; i++)
{if (Array[i] > a && Array[i] < b)
{
b = Array[i];
n2 = i;
}
}
Array[n1] = b;
Array[n2] = a;
Array = ArrangeArray(Array, n1);
return Array;
}
public static int[] ArrangeArray(int[] Array, int n1)
{
//Частину переданого масиву до елемента n1 залишаємо як є,
//решту сортуємо в порядку зростання
int newArray[];
newArray = new int[Array.length];
for (int i = 0; i <= n1; i++)
{
newArray[i] = Array[i];
Array[i] = 0;
}
Arrays.sort(Array);
for(int i = n1 +1 ; i < Array.length; i++)
{
newArray[i] = Array[i];
}
return newArray;
}
}
Без сумніву, можна написати витонченіше та простіше. Та питання в наступному: в рекурсивній функції в Arrays1 на кожному кроці лексикографічного впорядкування додається масив (в даному випадку з трьох) чисел. Але, після виходу з рекурсії в ArrayOfArrays міститься зовсім не те, що було туди додано.
По ходу виконання додається:
1, 2, 3
1, 3, 2
2, 1, 3
2, 3, 1
3, 1, 2
3, 2, 1
а в кінці при переборі ArrayOfArrays виводиться
0, 0, 2
0, 1, 3
0, 0, 1
0, 1, 2
0, 0, 1
3, 2, 1
Чому так? Дякую!