Перейти к содержимому

Фото
- - - - -

Ява массивы


  • Вы не можете создать новую тему
  • Please log in to reply
19 ответов в этой теме

#1 OzzY

OzzY

    Великий и Ужасный

  • Пользователь
  • 461 сообщений

Отправлено 05 ноября 2006 - 14:48

Проблемма: имею список, внутри которого другой список. Хочу иметь Двумерный массив строк. Как мне перекидать элементы из списка в массив? :angry:
  • 0

#2 Solmyr

Solmyr
  • Пользователь
  • 32 сообщений

Отправлено 08 ноября 2006 - 00:59

Вроде так, если правильно понял.
import java.util.*;

public class ListToArray {

	public static void main(String[] args) {
		List<List<String>> l1 = new ArrayList<List<String>>();
		List<String> l2 = new ArrayList<String>();
		l2.add("test");
		List<String> l3 = new ArrayList<String>();
		l3.add("test2");
		l3.add("test3");
		l1.add(l2);
		l1.add(l3);
		
		String[][] str = new String[l1.size()][0];
		Iterator<List<String>> it = l1.iterator();
		for (int i = 0; it.hasNext(); i++)
		{
			List<String> next = it.next();
			str[i] = next.toArray(str[i]);
		}
		
		for (int i = 0; i < str.length; i++)
			for (int j = 0; j < str[i].length; j++)
				System.out.println(str[i][j] + " i = " + i + " j = " + j);
	}
}

  • 0

#3 OzzY

OzzY

    Великий и Ужасный

  • Пользователь
  • 461 сообщений

Отправлено 11 ноября 2006 - 12:53

А если мне надо отсортировать массив по определенному индексу столбца, но чтобы перемещались и строки, то как? (двумерный массив, не лист)
  • 0

#4 Solmyr

Solmyr
  • Пользователь
  • 32 сообщений

Отправлено 11 ноября 2006 - 14:01

Не понял что ты хочешь сделать =)... можно пример как оно сортироваться должно? =)
  • 0

#5 OzzY

OzzY

    Великий и Ужасный

  • Пользователь
  • 461 сообщений

Отправлено 11 ноября 2006 - 19:28

я хочу отсортировать двумерный массив в зависимости от заданного индекса столбца!! Тоесть, если у меня есть массив, скажем такой:
{{10,6,5},
{3,4,1},
{45,23,45}};
меня просят отсортировать по 2 столбцу, тоесть эллементы второго(6,4,23) поставить в возрастающем порядке, но так, чтобы переместилась вся строка, тоесть в этом примере:

сортирую по второму столбцу, в возрастающем порядке (должен получить):

{{3,4,1},
{10,6,5},
{45,23,45}}

еще я делал так:
Первоначальный массив control[5][3]. вот он:
3885000 3934 987
6370000 28681 222 
15000000 7030 2133
12000000 5782 2075
7500000 28681 261
вот такой код (c4Source=1):
for(int i=0;i<4;i++) {  
for(int j=0;j<4;j++) {
if(control[i][c4Source-1]>control[j][c4Source-1]) {
int abi = control[i][c4Source-1];
control[i][c4Source-1] = control[j][c4Source-1];
control[j][c4Source-1] = abi;
}
}
}
дает вот такой результат:
15000000 3934 987
12000000 0 0
7500000 28681 222 
6370000 0 0
3885000 7030 2133
0 0 0 
0 5782 2075
0 0 0
0 28681 261
0 0 0
Обратите внимания, что поменялись местами первые эллементы(некоторые) а второй и третий остались на месте. При этом появились нули. Мне нужно, чтобы в зависимости от с4Source происходила сортировка по нулевому, первому или второму элементу ряда, но при этом чтобы строки тоже перемещались.

Сообщение изменено: OzzY (11 ноября 2006 - 19:28 )

  • 0

#6 Solmyr

Solmyr
  • Пользователь
  • 32 сообщений

Отправлено 11 ноября 2006 - 20:46

c4Source-1 постоянно лучше не считать... вычислить его сразу после ввода один раз =)

... тогда так:
import java.util.Arrays;
import java.util.Comparator;

public class ArraySort {

	public static void main(String[] args) {
		
		// сорт по второму "столбцу"
		final int sortBy = 1;
		
		int[][] arr = {
				{3885000, 3934, 987},
				{3, 4, 1},
				{6370000, 28681, 222},
				{15000000, 7030, 2133},
				{45}, //, 23, 45
				{12000000, 5782, 2075},
				{10, 6, 5},
				{7500000, 28681, 261}
		};
		
		Comparator comp = new Comparator()
		{
			public int compare(Object arg0, Object arg1)
			{
				int[] arr1 = ((int[])arg0);
				int[] arr2 = ((int[])arg1);
				
				// Если в строке вообще нет нужного столбца,
				// ставим её сверху
				if (arr1.length <= sortBy) return -1;
				if (arr2.length <= sortBy) return  1;
				
				return Integer.valueOf(arr1[sortBy]).compareTo(Integer.valueOf(arr2[sortBy]));
			}
		};
		
		Arrays.sort(arr, comp);
		
		for (int i = 0; i < arr.length; i++)
		{
			System.out.println();
			for (int j = 0; j < arr[i].length; j++)
			{
				System.out.print(arr[i][j] + " ");
			}
		}
	}
}

вывод:
45 
3 4 1 
10 6 5 
3885000 3934 987 
12000000 5782 2075 
15000000 7030 2133 
6370000 28681 222 
7500000 28681 261

Сообщение изменено: Solmyr (11 ноября 2006 - 20:48 )

  • 0

#7 OzzY

OzzY

    Великий и Ужасный

  • Пользователь
  • 461 сообщений

Отправлено 11 ноября 2006 - 23:06

вау, хитро, ничего не скажешь, а без перехода к листам разве никак не сделать? думаеццо мне, что можно..потому что вот такая фигня:
/array sorting by defined parameter 
for(int i=0;i<control.length;i++) {  
for(int j=0;j<control.length-1;j++) {
	if(control[j][c4Source-1]>control[j+1][c4Source-1]) {
		int abi = control[j][c4Source-1];
		if(c4Source==1) {
		abi1 = control[j][1];
		abi2 = control[j][2];
		} else {
		if(c4Source==2) {
		abi1 = control[j][0];
		abi2 = control[j][2];
		} else {
		abi1 = control[j][0];
		abi2 = control[j][1];
		}
	}
	control[j][c4Source-1] = control[j+1][c4Source-1];
	control[j+1][c4Source-1] = abi;
	if(c4Source==1) {
	control[j+1][1] = abi1;
	control[j+1][2] = abi2;
	} else {
	if(c4Source==2) {
	control[j+1][0] = abi1;
	control[j+1][2] = abi2;
	} else {
	control[j+1][0] = abi1;
	control[j+1][1] = abi2;
	}
}
}
}
}
сортирует почти ок, но не совсем))
  • 0

#8 Solmyr

Solmyr
  • Пользователь
  • 32 сообщений

Отправлено 11 ноября 2006 - 23:42

так там нет никакого перехода к листам =)... все чисто массивы =)
  • 0

#9 OzzY

OzzY

    Великий и Ужасный

  • Пользователь
  • 461 сообщений

Отправлено 12 ноября 2006 - 20:22

Спасибо, это работает), только почему-то у меня сначала столько же строк нулей, сколько строк в массиве. Тоесть нули непонятно откуда беруться...поначалу обычный массив а потом нули(
  • 0

#10 Solmyr

Solmyr
  • Пользователь
  • 32 сообщений

Отправлено 12 ноября 2006 - 22:08

а можешь полностью код написать, в котором нули появляются сами?.. =)
  • 0

#11 OzzY

OzzY

    Великий и Ужасный

  • Пользователь
  • 461 сообщений

Отправлено 14 ноября 2006 - 19:41

Ну вот функция, которая принимает список из другой функции(в списке нет нулей) а также параметр по которому будет проходить сортировка c4Source.

Прикрепленные файлы

  • Прикрепленный файл  sort.txt   1,33К   12 Количество загрузок

  • 0

#12 Solmyr

Solmyr
  • Пользователь
  • 32 сообщений

Отправлено 14 ноября 2006 - 21:41

я так понял нули появляются из-за того, что массив размером с лист (int [][] control = new int [base.size()][3];)... а значений в него записывается в 2 раза меньше (int [] help = new int [base.size()]; -> i<help.length-1 -> if(i%2==0))... вот пустые строчки и с нулями... и их ровно столько-же, сколько заполненных =)
  • 0

#13 OzzY

OzzY

    Великий и Ужасный

  • Пользователь
  • 461 сообщений

Отправлено 14 ноября 2006 - 22:28

хех, логично) спасибо, исправил...теперь вроде все ок))

Сообщение изменено: OzzY (14 ноября 2006 - 22:59 )

  • 0

#14 Solmyr

Solmyr
  • Пользователь
  • 32 сообщений

Отправлено 14 ноября 2006 - 22:59

судя по коду - размер массива = base.size()/2 (вот тут только точно не помню вверх или вниз он округляет) и при добавлении control[i/2][0]...
  • 0

#15 OzzY

OzzY

    Великий и Ужасный

  • Пользователь
  • 461 сообщений

Отправлено 15 ноября 2006 - 17:43

еще пара вопросов...вот если у меня есть некоторый класс, который ничего не расширяет, не имплементирует, то могу ли я из этого класса вызывать сообщения о какой-то ошибке в MessageBox-ах? Или мне нужно для этого сделать для этого класса calss extends JFrame?
и еще, вот я рисую график (кривая линия) и наименьшее и наибольшее значения в этом графике очень сильно стоят друг от друга, например 200 и 30 000. То как мне расчтать координату по игреку, чтобы при любом размере окна график полностью влазил в этот размер и не выходил за рамки (по иксу у меня все ок)?
  • 0

#16 simonsays

simonsays
  • Пользователь
  • 835 сообщений

Отправлено 17 ноября 2006 - 05:27

слушай, а ты понял, как вообще этот график должен выглядеть?
я что-то никак не соображу

что там на Х должно быть? сами участки? стоящие на одинаковой длине друг от друга?
на У должны быть по идее площадь, цена и цена за квадрат? и для каждой величины по кривой?


если я правильно догнал, то думаю, что моё решение если не самое лучшее, то нормальное.

задаёшь максимальное возможное расстояние от оси Х до точки по оси У, чтобы ничего не вылазило. грубо говоря, максимальную высоту вершины.
потом два варианта:
- максимальное значение У на практике, если оно выходит за рамки, делишь на эту самую максимальную высоту... получаешь коэффициент, на который делишь все значения У для данного графика. по идее для всех трёх кривых
- если максимальное значение У <= максимальной высоты, то так всё и оставляешь

Сообщение изменено: simonsays (17 ноября 2006 - 07:50 )

  • 0

#17 OzzY

OzzY

    Великий и Ужасный

  • Пользователь
  • 461 сообщений

Отправлено 17 ноября 2006 - 12:41

ну да, ты правильно понял. Но твое решение до меня не очень дошло))
  • 0

#18 simonsays

simonsays
  • Пользователь
  • 835 сообщений

Отправлено 20 ноября 2006 - 08:28

а комбобоксы ты понял? а то там вообще какой-то лес густой
нигде в нете ничего толкового не написано

Сообщение изменено: simonsays (05 декабря 2006 - 03:37 )

  • 0

#19 OzzY

OzzY

    Великий и Ужасный

  • Пользователь
  • 461 сообщений

Отправлено 20 ноября 2006 - 16:49

комбобокс сделал, все ок работает...там вообщем не сложно, я делал так, сначала массив(например, уездов) String maak = {тут все уезды} и потом JComboBox combo = new JComboBox(maak); а уезды получал оттуда combo.getSelectedIndex();
  • 0

#20 simonsays

simonsays
  • Пользователь
  • 835 сообщений

Отправлено 23 ноября 2006 - 04:54

спасибо! действительно, я был неправ, это оказалось просто. а вот с графиком на самом деле засада... :)
  • 0