Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Java программирование > Общие вопросы по Java, Java SE, Kotlin
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 28.07.2016, 17:08   #1
mathematyk
Новичок
Джуниор
 
Регистрация: 28.07.2016
Сообщений: 2
По умолчанию Лексикографическое упорядочивание и ArrayList

Здравствуйте! 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

Почему так? Списибо!
mathematyk вне форума Ответить с цитированием
Старый 29.07.2016, 08:16   #2
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,876
По умолчанию

Копировать массив надо, т.к. в противном случае Вы по этой ссылке работаете (далее внутри рекурсивной функции), меняя оригинальный массив внутри уже добавленного списка (это один и тот же объект), это всё проверяется отладкой, кстати.
Копируем хотя бы так:
Код:
Arrays1.add(Arrays.copyOf(myArray, myArray.length));
Вывод после этой модификации такой, как Вы приводите.
phomm вне форума Ответить с цитированием
Старый 29.07.2016, 12:00   #3
mathematyk
Новичок
Джуниор
 
Регистрация: 28.07.2016
Сообщений: 2
По умолчанию

Большое спасибо, все работает.
mathematyk вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
c# arraylist world12_tk Помощь студентам 2 09.08.2011 10:19
ArrayList и FOR Anonim69 C# (си шарп) 3 13.04.2011 08:31
ArrayList musomoh Общие вопросы .NET 9 11.05.2010 02:03
ArrayList jona Общие вопросы по Java, Java SE, Kotlin 7 30.04.2010 13:45
arraylist WOWka777 Общие вопросы .NET 4 11.04.2010 19:05