Ява массивы
Started By OzzY, ноя 05 2006 14:48
19 ответов в этой теме
#2
Отправлено 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); } }
#5
Отправлено 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]. вот он:
{{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 )
#6
Отправлено 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 )
#7
Отправлено 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; } } } } }сортирует почти ок, но не совсем))
#12
Отправлено 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))... вот пустые строчки и с нулями... и их ровно столько-же, сколько заполненных =)
#15
Отправлено 15 ноября 2006 - 17:43
еще пара вопросов...вот если у меня есть некоторый класс, который ничего не расширяет, не имплементирует, то могу ли я из этого класса вызывать сообщения о какой-то ошибке в MessageBox-ах? Или мне нужно для этого сделать для этого класса calss extends JFrame?
и еще, вот я рисую график (кривая линия) и наименьшее и наибольшее значения в этом графике очень сильно стоят друг от друга, например 200 и 30 000. То как мне расчтать координату по игреку, чтобы при любом размере окна график полностью влазил в этот размер и не выходил за рамки (по иксу у меня все ок)?
и еще, вот я рисую график (кривая линия) и наименьшее и наибольшее значения в этом графике очень сильно стоят друг от друга, например 200 и 30 000. То как мне расчтать координату по игреку, чтобы при любом размере окна график полностью влазил в этот размер и не выходил за рамки (по иксу у меня все ок)?
#16
Отправлено 17 ноября 2006 - 05:27
слушай, а ты понял, как вообще этот график должен выглядеть?
я что-то никак не соображу
что там на Х должно быть? сами участки? стоящие на одинаковой длине друг от друга?
на У должны быть по идее площадь, цена и цена за квадрат? и для каждой величины по кривой?
если я правильно догнал, то думаю, что моё решение если не самое лучшее, то нормальное.
задаёшь максимальное возможное расстояние от оси Х до точки по оси У, чтобы ничего не вылазило. грубо говоря, максимальную высоту вершины.
потом два варианта:
- максимальное значение У на практике, если оно выходит за рамки, делишь на эту самую максимальную высоту... получаешь коэффициент, на который делишь все значения У для данного графика. по идее для всех трёх кривых
- если максимальное значение У <= максимальной высоты, то так всё и оставляешь
я что-то никак не соображу
что там на Х должно быть? сами участки? стоящие на одинаковой длине друг от друга?
на У должны быть по идее площадь, цена и цена за квадрат? и для каждой величины по кривой?
если я правильно догнал, то думаю, что моё решение если не самое лучшее, то нормальное.
задаёшь максимальное возможное расстояние от оси Х до точки по оси У, чтобы ничего не вылазило. грубо говоря, максимальную высоту вершины.
потом два варианта:
- максимальное значение У на практике, если оно выходит за рамки, делишь на эту самую максимальную высоту... получаешь коэффициент, на который делишь все значения У для данного графика. по идее для всех трёх кривых
- если максимальное значение У <= максимальной высоты, то так всё и оставляешь
Сообщение изменено: simonsays (17 ноября 2006 - 07:50 )