Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > использование ArrayList


Автор: Rauko 23.8.2015, 17:24
учусь пользоваться коллекциями, с трудом разобралась, как пользоваться TreeSet... Однако после реализации поняла, что сам TreeSet в моем случае не до конца подходит: если данные совпадают - он не выводит строку на экран
Код

// TreeSet
    Set<Employee> sortedEmp = new TreeSet<>(new Comparator <Employee>() {
        public int compare(Employee e1, Employee e2) {
            if (e1.getINN() > e2.getINN()) 
                return 1;
            if (e1.getINN() < e2.getINN()) 
                return -1;
            return 0;
        }
    });
    for(int i = 0; i < e.length; i++)
        sortedEmp.addAll(Arrays.asList(e[i]));


есть ли варианты использования кроме ArrayList? как его правильно использовать с учетом необходимости сортировки?

Автор: AntonSaburov 24.8.2015, 10:23
На куске кода вообще никакого вывода нет - мы не экстрасенсы. Также в Set нельзя хранить два одинаковых объекта.

Автор: AntonSaburov 24.8.2015, 13:11
И вопрос какой-то странный - с ArrayList работаем или с TreeSet ?

Автор: Rauko 24.8.2015, 15:29
вывод работает, вот в чем дело ))) но если уж так интересно, вот код вывода для 

Код

    public void simpleOutPut(SortedSet<Employee> sortedEmp){
        for(Employee currentEmpl : sortedEmp){
            int lng = transformData(currentEmpl.getINN()).length();
            System.out.print("║ "); space(lng,2);
            System.out.print(currentEmpl.getINN() + " ║ ");
            lng = currentEmpl.getFirstName().length();
            System.out.print(currentEmpl.getFirstName());
            space(lng,13);
            System.out.print(" │ " + currentEmpl.getSecondName());
            lng = currentEmpl.getSecondName().length();
            space(lng,13);
            System.out.print(" ║ ");
            System.out.println(currentEmpl.getPosition() + " ║");
        }
    }


проблема заключается в том, что я не могу понять, как в ArraysList запрячь мой массив Employee.
то, что строки с одинаковыми значениями нельзя хранить в TreeSet и стало причиной поиска других вариантов решения задачи...
была еще мысль спросить про HashSet, вроде он тоже приемлем для решения задачи

Автор: AntonSaburov 24.8.2015, 17:51
Мы же с Вами рассматривали вариант с Comparator в другой ветке.

Автор: CPlusPlusFAN 24.8.2015, 18:25
Rauko, ArrayList подходит идеально.

Автор: Rauko 24.8.2015, 21:32
Цитата(AntonSaburov @ 24.8.2015,  17:51)
Мы же с Вами рассматривали вариант с Comparator в другой ветке.

это та же задача, но уже с использованием коллекций...

60 лабораторных слишком быстро сделали, преподаватель выкручивается как может - мы уже 4 раза эту задачу под разные условия переделывали...

по поводу TreeSet сказал, что да, так можно(в случае с INN, где генерируется уникальное число... обычно), но для наглядности лучше сделать все 3 варианта по-разному

Автор: CPlusPlusFAN 27.8.2015, 02:46
Цитата(Rauko @  24.8.2015,  15:29 Найти цитируемый пост)
проблема заключается в том, что я не могу понять, как в ArraysList запрячь мой массив Employee.

Код

new ArrayList<>(Arrays.<Employee>asList(e))

Set будет работать только в случае, если уберете из Employee методы equals и hashCode и то, если не кидать в него одинаковые объекты. Таков контракт сетов.
Листы, например, подходят любые, очереди и т.д.

Автор: Samotnik 31.8.2015, 22:29
Цитата(Rauko @  24.8.2015,  15:29 Найти цитируемый пост)
проблема заключается в том, что я не могу понять, как в ArraysList запрячь мой массив Employee.

В ArrayList запрягается всё что угодно, Британские ученые доказали, что ArrayList используется в 78% случаях, когда программисты работают с коллекциями. Его все любят и лелеют.

Цитата(Rauko @  24.8.2015,  21:32 Найти цитируемый пост)
по поводу TreeSet сказал, что да, так можно(в случае с INN, где генерируется уникальное число... обычно), но для наглядности лучше сделать все 3 варианта по-разному 

Имплементация интерфейса Set существует в 97 классах Java 1.8. Тебе какая нужна?

Автор: Rauko 2.9.2015, 13:47
Цитата
В ArrayList запрягается всё что угодно, Британские ученые доказали, что ArrayList используется в 78% случаях, когда программисты работают с коллекциями. Его все любят и лелеют.

я не могу понять сам синтаксис, особенно, если пытаться создать коллекцию внутри класса и в последствии ее вызывать - вот пример из другой задачи:
написать программу, которая будет содержать в себе информацию о сети кинотеатров(~3 элемента). каждый кинотеатр имеет 
- название
- адрес
- контактную информацию
- несколько залов
каждый зал имеет 
- название
- расписание фильмов

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

Код

public class Cinema {
    private String cinemaName;    // название кинотеатра
    private String cinemaAddress;    // адрес кинотеатра
    private String cinemaContact;    // контакты
    private int roomNum;        // число комнат
    private int workStart;        // начало работы
    ...

Код

public class CinemaRoom extends Cinema {
    private String name;                                    // название зала
    private ArrayList<String> filmList = new ArrayList<String>();    // список фильмов на зал
    ...


(этот вопрос немного не по теме, но возможно к нему приведется)создала массив из класса Cinema на 3 элемента, как в каждом из них запилить массив из комнат CinemaRoom(по 2-3 штучки)? через что это выполняется или как поправить код для реализации?

можно ли реализовать как то первый класс через коллекции? как это будет выглядеть?
какой командой выполняется заливка в ArrayList<String> filmList из другого класса? геттеры-сеттеры реализованы через стандартный эклипсовский билдер

Цитата
Имплементация интерфейса Set существует в 97 классах Java 1.8. Тебе какая нужна?

из сетов, вероятно, лучше всего подойдет HashSet, но не пойму, как правильно в нем синтаксис выглядит и как прикрутить по примеру TreeSet сортировку(или иными методами)

в ArrayList так же не могу понять, как вкрутить в него сортировку

Автор: CPlusPlusFAN 2.9.2015, 17:23
Цитата(Rauko @  2.9.2015,  13:47 Найти цитируемый пост)
я не могу понять сам синтаксис, особенно, если пытаться создать коллекцию внутри класса и в последствии ее вызывать - вот пример из другой задачи:
написать программу, которая будет содержать в себе информацию о сети кинотеатров(~3 элемента)

Не очень понял. Ну вроде вот:
Код

for (Cinema cinema : cinemaList) {
    System.out.println(cinema);
}


Цитата(Rauko @  2.9.2015,  13:47 Найти цитируемый пост)
создала массив из класса Cinema на 3 элемента, как в каждом из них запилить массив из комнат CinemaRoom(по 2-3 штучки)? через что это выполняется или как поправить код для реализации?

Типа того:
Код

for (Cinema cinema : cinemaArray) {
    cinema.setRooms(new Room[3]);
}


Цитата(Rauko @  2.9.2015,  13:47 Найти цитируемый пост)
можно ли реализовать как то первый класс через коллекции? как это будет выглядеть?

Что значит "реализовать класс через коллекции"?

Цитата(Rauko @  2.9.2015,  13:47 Найти цитируемый пост)
какой командой выполняется заливка в ArrayList<String> filmList из другого класса? геттеры-сеттеры реализованы через стандартный эклипсовский билдер

Код

obj1.setFilmList(new ArrayList<String>(obj2.getFilmList()));


Цитата(Rauko @  2.9.2015,  13:47 Найти цитируемый пост)
из сетов, вероятно, лучше всего подойдет HashSet, но не пойму, как правильно в нем синтаксис выглядит и как прикрутить по примеру TreeSet сортировку(или иными методами)

Никак. HashSet несортируем. И зачем вообще нужен сет, я так до конца и не понял.

Цитата(Rauko @  2.9.2015,  13:47 Найти цитируемый пост)
в ArrayList так же не могу понять, как вкрутить в него сортировку

Код

Collections.sort(yourArrayList); // элементы Comparable
Collections.sort(yourArrayList, yourComparator); // нужен свой порядок сортировки

Автор: Rauko 2.9.2015, 18:51
Цитата
Не очень понял.

в идеале, что бы как то на такое отзывалось: (описанное ниже взято от фанаря)
Код

Cinema[] theatre = new Cinema[3];
theatre[0].setRooms(2);
theatre[1].setRooms(3);
theatre[2].setRooms(2);
for(int i = 0; i < theatre.length; i++){
    for(int j = 0; j < theatre[i].getRooms(); j++){
        theatre[i].createRooms(getRooms());
}

Код

CinemaRoom [] rooms;
...
public void createRooms(int getRooms()){
    rooms[] = new CinemaRoom[getRooms()]; //содержит коллекцию с фильмами и название комнаты
}

имхо нужна организация доступа через theatre[...]. знаю, что такое как то реализовывается, но какими путями - без понятия... два дня "эксперементирую", но не работает

Цитата
Что значит "реализовать класс через коллекции"?

можно ли вышеупомянутый theatre засунуть в коллекцию и при этом сохранить все его содержимое в том порядке, в котором оно и так там лежит? будет ли в этом смысл и делается ли так на практике?

Цитата
И зачем вообще нужен сет, я так до конца и не понял.

это в другой задаче осталось... выполнить 3 сортировки списка на 10 строк по разным ключам разного типа (String, double, int). Реализовала через TreeSet, но после сдачи решила еще немного подкорректировать и сделать все сортировки по-разному. На потоке все делали через ArrayList, вот теперь думаю, какой делать третью сортировку, раз хэш несортируем.

Автор: CPlusPlusFAN 2.9.2015, 20:57
Цитата(Rauko @  2.9.2015,  18:51 Найти цитируемый пост)
в идеале, что бы как то на такое отзывалось: (описанное ниже взято от фанаря)

Просто опишите метод, создающий нужное число инстансов комнат по их количеству:
Код

Cinema[] theater = new Cinema[3];
theater[0] = new Cinema();
theater[0].createRooms(2);
theater[1] = new Cinema();
theater[1].createRooms(3);
theater[2] = new Cinema();
theater[2].createRooms(2);

...

public class Cinema {
    private List<Room> rooms = new ArrayList<>();

    public void createRooms(int count) {
        rooms.clear();
        for (int i = 0; i < count; ++i) {
            Room room = new Room(); // новая комната
            rooms.add(room);
        }
    }
}

И я не понимаю стремление хранить все в массивах. ArrayList достаточно хорош и лишен некоторых недостатков массива. По мне так сценариев, когда нужен именно массив, можно пересчитать по пальцам.

Цитата(Rauko @  2.9.2015,  18:51 Найти цитируемый пост)
имхо нужна организация доступа через theatre[...]. знаю, что такое как то реализовывается, но какими путями - без понятия... два дня "эксперементирую", но не работает

Так доступ по индексу, не?

Цитата(Rauko @  2.9.2015,  18:51 Найти цитируемый пост)
можно ли вышеупомянутый theatre засунуть в коллекцию и при этом сохранить все его содержимое в том порядке, в котором оно и так там лежит? будет ли в этом смысл и делается ли так на практике?

Конечно, ArrayList в помощь.

Цитата(Rauko @  2.9.2015,  18:51 Найти цитируемый пост)
это в другой задаче осталось... выполнить 3 сортировки списка на 10 строк по разным ключам разного типа (String, double, int). Реализовала через TreeSet, но после сдачи решила еще немного подкорректировать и сделать все сортировки по-разному. На потоке все делали через ArrayList, вот теперь думаю, какой делать третью сортировку, раз хэш несортируем. 

Если так хочется потестить разные коллекции: LinkedList, ArrayDeque. Если хочется экзотики, можно попробовать CopyOnWriteArrayList. Все они подходят под задачу.

Автор: Rauko 2.9.2015, 21:38
Цитата
И я не понимаю стремление хранить все в массивах. ArrayList достаточно хорош и лишен некоторых недостатков массива. По мне так сценариев, когда нужен именно массив, можно пересчитать по пальцам.

просто я еще маленький крабокодер, только выползший из массивов и еще не до конца разобравшийся с коллекциями...

к слову, есть еще такой вопрос... возможно ли загружать в коллекцию(в тот же ArrayList) данные строками? например
"1801" "вася" "пупкин" "4000" "главбух"
"1999" "коля" "жопорук" "7000" "повар"
как будет это выглядеть?(интересует сам загруз в коллекцию и выгрузка для использования)



благодарю, приступаю к обкатке уже полученных данных... надеюсь пройдет гладко, если что - вернусь с вопросами

Автор: Samotnik 2.9.2015, 22:39
Rauko, чувствую, что вопрос какой-то очень простой, но ты спрашиваешь так, что ничего не понятно.
Цитата(Rauko @  2.9.2015,  21:38 Найти цитируемый пост)
к слову, есть еще такой вопрос... возможно ли загружать в коллекцию(в тот же ArrayList) данные строками? например
"1801" "вася" "пупкин" "4000" "главбух"
"1999" "коля" "жопорук" "7000" "повар"

так?
Код

import java.util.*;

public class Main {
    public static void main(String[] args) {

        //создаем главный список с кол-вом элементов = 2
        List<List<String>> mainList = new ArrayList<>(2);

        //создаем внутренний список, в котором будет 4 элемента
        List<String> stringList = new ArrayList<>(4);

        //заполняем
        stringList.add("1801");
        stringList.add("вася");
        stringList.add("пупкин");
        stringList.add("4000");
        stringList.add("главбух");

        //добавляем в главный
        mainList.add(stringList);

        //пересоздаем объект, либо можно создать второй список
        stringList = new ArrayList<>(4);

        //заполняем второй список
        stringList.add("1999");
        stringList.add("коля");
        stringList.add("рукастый");
        stringList.add("7000");
        stringList.add("повар");

        //добавляем второй список в главный
        mainList.add(stringList);

        //проверка, что всё по честному
        for (List<String> printList : mainList) {
            for (String str : printList) {
                System.out.print(str + " ");
            }
            System.out.println("");
        }
    }
}

Автор: Rauko 2.9.2015, 22:55
можно ли будет выцепить из получившейся коллекции какой то определенный элемент? можно ли будет в последствии работать с коллекцией как с массивом?

если раньше, загнав в массив свои элементы я точно знала, что в столбце i находятся одни данные, а в столбце j - другие, и для всех столбцов(созданных по такой кальке) это было одинаково справедливо и по этому принципу можно было легко реализовать программу, то можно ли все это повторить для коллекций?

Автор: Samotnik 2.9.2015, 23:45
Цитата(Rauko @  2.9.2015,  22:55 Найти цитируемый пост)
можно ли будет выцепить из получившейся коллекции какой то определенный элемент? 

Можно:
Код

//создаем внутренний список, в котором будет 4 элемента
List<String> stringList = new ArrayList<>(4);

//заполняем
stringList.add("1801");
stringList.add("вася");
stringList.add("пупкин");
stringList.add("4000");
stringList.add("главбух");

//Достаем, к примеру 3-й
stringList.get(2); //с нуля начинается, да?

Цитата(Rauko @  2.9.2015,  22:55 Найти цитируемый пост)
можно ли будет в последствии работать с коллекцией как с массивом?

Можно, но зачем? Коллекции, по сути и были введены, что бы отказаться от массивов. 
Код

//создаем внутренний список, в котором будет 4 элемента
List<String> stringList = new ArrayList<>(4);

//заполняем
stringList.add("1801");
stringList.add("вася");
stringList.add("пупкин");
stringList.add("4000");
stringList.add("главбух");

//перегоняем коллекцию в массив
String[] stockArr = new String[stringList.size()];
stockArr = stringList.toArray(stockArr);


Цитата(Rauko @  2.9.2015,  22:55 Найти цитируемый пост)
если раньше, загнав в массив свои элементы я точно знала, что в столбце i находятся одни данные, а в столбце j - другие, и для всех столбцов(созданных по такой кальке) это было одинаково справедливо и по этому принципу можно было легко реализовать программу, то можно ли все это повторить для коллекций? 

Конечно можно - коллекции очень умные, гибкие и продуманные решения в Java для работы с данными. Их около сотни на сегодняшний день и у каждой есть свои особенности. В твоем случае подойдет ArrayList он содержит элементы в том порядке, в котором их добавляли, другие реализации могут как угодно сортировать входящие данные, поэтому тут нужно быть внимательным, точнее, хорошо знать API с чем работаешь. 

Автор: CPlusPlusFAN 3.9.2015, 01:22
Цитата(Rauko @  2.9.2015,  21:38 Найти цитируемый пост)
к слову, есть еще такой вопрос... возможно ли загружать в коллекцию(в тот же ArrayList) данные строками? например
"1801" "вася" "пупкин" "4000" "главбух"
"1999" "коля" "жопорук" "7000" "повар"
как будет это выглядеть?(интересует сам загруз в коллекцию и выгрузка для использования)

Дык конечно можно выстрелить себе в ногу. Почему бы и нет? С точки зрения логики все строки равнозначны, поэтому и имеет смысл их хранить в списке. Однако каждый столбец имеет свой собственный смысл. Тогда уже список хэш мапов нужен, чтобы ключ ассоциировался с конкретным элементом записи.
Вот добавится в середину или удалится какая-то колонка, если бы использовались инстансы класса, тогда сразу же бы была ошибка компиляции и вы бы это смогли корректно исправить. А в списке списков забыли везде обновить индексы - и у вас уже число как фамилия обрабатывается, например. 

Автор: Rauko 3.9.2015, 07:42
Цитата(Samotnik @  2.9.2015,  23:45 Найти цитируемый пост)
Можно:

я упорно не могу понять, как именно осуществляется запрягание в коллекцию... вернее не могу понять, как коллекция распознает следующую конструкцию:
Код

String[][] nnn = new String[4][];
    nnn[0] = new String[5];
    nnn[0] = {"fd","gs","tw","","14r"};
    nnn[1] = new String[5];
    nnn[1] = {"fd","qws","12w","","14r"};


упорно не доходит, где та разница между nnn[0] и nnn[1]

Автор: Samotnik 3.9.2015, 10:56
Rauko, я ведь уже писал как можно архитектуру двумерного массива перенести в коллекцию. Но теперь меня инетерсует вопрос, зачем это всё  делать?

Автор: Rauko 3.9.2015, 11:05
обучение пользованию коллекциями, пока ничего больше

пока учила массивы, поняла принцип их пользования только когда усложнила их до трехмерных, тогда же примерно начала ими нормально пользоваться, сейчас с диким скрипом начинаю понимать коллекции... хотя пока об этом наверно еще рано говорить smile  smile  smile 

Автор: Samotnik 3.9.2015, 12:06
так в чем конкретно вопрос?  

Автор: Rauko 3.9.2015, 22:17
конкретно вопрос - я запрягаю определенное количество данных следующей конструкцией:

Код

List<String> stringList = new ArrayList<>(4);

stringList.add("...");
....
stringList = new ArrayList<>(4);
stringList.add("...");
....
stringList = new ArrayList<>(4);
stringList.add("...");
....
stringList = new ArrayList<>(4);
stringList.add("...");
....


как определить, с какой "строки" коллекции данные?

Автор: Samotnik 4.9.2015, 00:27
Цитата(Rauko @  3.9.2015,  22:17 Найти цитируемый пост)
как определить, с какой "строки" коллекции данные? 

а если перефразировать, я не понял вопрос? Коллекция - хранилище данных. Что значит "с какой строки коллекции данные"?

Автор: CPlusPlusFAN 4.9.2015, 16:15
Цитата(Samotnik @  4.9.2015,  00:27 Найти цитируемый пост)
а если перефразировать, я не понял вопрос? Коллекция - хранилище данных. Что значит "с какой строки коллекции данные"? 

Я кажется понял. Т.е. кидаем все строки в лист и запрашиваем элемент и нужно узнать, в какой из строк запрашиваемый элемент был взят:
"1801" "вася" "пупкин" "4000" "главбух"
"1999" "коля" "жопорук" "7000" "повар"

Если я правильно понял.
Ответ: если число столбцов известно - columnsCount, то  index/columnsCount. Но это бред все сливать в одну коллекцию.
Можно так:
Код

List<List<String>> records = new ArrayList<>();
records.add(new ArrayList<>(5));
records.get(0).add("...");
records.get(0).add("...");
...

Еще лучше так:
Код

List<Map<String, String>> records = new ArrayList<>();
records.add(new HashMap<>(5));
records.get(0).put("field1", "...");
records.get(0).put("field2", "...");
...

А правильно вот так (если структура столбцов известна заранее):
Код

class Record {
private String field1;
private String field2;
...
// getters, setters
}

List<Record> records = new ArrayList<>();
records.add(new Record());
records.add(new Record());
...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)