С Новым годом! Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
6 / 6 / 7
Регистрация: 16.05.2013
Сообщений: 351

Comparable в Array

24.06.2017, 17:32. Показов 753. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток!

Есть всем знакомый класс Person:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
public class Person implements Comparable<Person>, Cloneable
{
    int id;
    String fname;
    String lname;
    int age;
    int id_street;
    
    public Person(int id, String fname, String lname, int age, int id_street)
    {
        this.id = id;
        this.fname = fname;
        this.lname = lname;
        this.age = age;
        this.id_street = id_street;
    }
    
    @Override
    public String toString()
    {
        return String.format("%1$d) My name is %2$s %3$s. I'm %4$d. Street id is %5$d", id,fname,lname,age,id_street);
    }
 
    @Override
    public int compareTo(Person p)
    {
        return new Integer(this.id).compareTo(p.id);
    }
 
    @Override
    public Object clone()
    {
        return new Person(id,fname,lname,age,id_street);
    }   
}
И так же есть структура, реализующая кастомный List:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class LList1G<T> implements GList<T>
{
    class Node //вложенный класс составных частей списка
    {
        T val;
        Node next;
        
        public Node(T val)
        {
            this.val = val;
        }
    }
    
    Node root = null;
    int Count = 0;
 
        // Далее куча методов типа add,del,reverse и т.п.
}
Проблема состоит вот в чем: при попытке вызова метода toArray() данного списка получаю ошибку:
Exception in thread "main" java.lang.ClassCastException: [Ljava.lang.Comparable; cannot be cast to [Llist_construction.Person;
at list_construction.Actions.main(Actions.java:76)

Данные в возвращаемом массиве валидные и нужного типа (проверено). Вероятно сам массив чего-то не того типа...

Вот реализация метода toArray() и вспомогательного метода:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
@Override
    public T[] toArray()
    {       
        T[] ret = (T[])((Cloneable) new Comparable [size()]);
        int i=0;
        
        Node tmp = root;
        
        while(tmp != null)
        {
            ret[i++] = getClone(tmp.val);
            tmp = tmp.next;
        }
        
        return ret;
    }
    private T getClone(T obj)
    {
        T ret = null;
        try
        {
            ret = (T) obj.getClass().getMethod("clone").invoke(obj);
        }
        catch(Exception ex)
        {
            ex.printStackTrace();
        }
        
        return ret;
    }
Так выглядит main:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class Actions
{
    public static void main(String[] args)
    {       
        LList1G<Person> l = new LList1G<Person>();
 
        Person[] ar = new Person[2];
        ar[0] = new Person(1,"Вася","Пупкин",23,1);
        ar[1] = new Person(2,"Петровский","Неизвестный",20,2);
 
        l.init(ar); // инициализация
        Person[] array = l.toArray(); // тут ошибка!
        
        for (Person p : array)
        {
            System.out.println(p.toString());
        }
    }
}
Подскажите, пожалуйста, как можно исправить ситуацию и всё таки получить желаемый массив? Заранее благодарю за любые ответы!
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
24.06.2017, 17:32
Ответы с готовыми решениями:

Интерфейс Comparable
Создайте класс Faculty, включающий два строковых и одно числовое поле. Создайте массив объектов данного класса, заполнив значения полей с...

Comparable vs Comparator
Несколько дней бьюсь над этой темой, но все равно остается недопонимание. Вот, например, в этой статье приводиться следующий пример: ...

Интерфейс Comparable
Учу Java и наткнулся на этот интерфейс. Он имеет всего один метод compareTo(), так как это интерфейс, то мы должны его реализовать. В...

4
502 / 348 / 134
Регистрация: 14.06.2016
Сообщений: 669
24.06.2017, 17:46
https://docs.oracle.com/javase... Class-int-
0
6 / 6 / 7
Регистрация: 16.05.2013
Сообщений: 351
24.06.2017, 22:17  [ТС]
Я так понял речь идет о методе newInstance. Однако его реализация для generic невозможна (как я понял) без передачи класса непосредственно внутрь структуры.

Подобная запись не проходит без дополнительного параметра Class<T> (которого может и не быть в коллекциях Java):
Java
1
2
T[] ret = null;
Array.newInstance(T, size());
T cannot be resolved to a variable

Однако при создании других коллекций, типа ArrayList<Object> obj = new ArrayList<Object>() мы не передаем никаких дополнительных аргументов в конструктор... Не подскажите как добиться такого эффекта?
0
502 / 348 / 134
Регистрация: 14.06.2016
Сообщений: 669
24.06.2017, 22:27
Реализация toArray() ArrayList
Java
1
2
3
4
5
6
7
8
9
10
    @SuppressWarnings("unchecked")
    public <T> T[] toArray(T[] a) {
        if (a.length < size)
            // Make a new array of a's runtime type, but my contents:
            return (T[]) Arrays.copyOf(elementData, size, a.getClass());
        System.arraycopy(elementData, 0, a, 0, size);
        if (a.length > size)
            a[size] = null;
        return a;
    }
Так же принимает параметр.
1
6 / 6 / 7
Регистрация: 16.05.2013
Сообщений: 351
24.06.2017, 22:50  [ТС]
Спасибо, весьма помогло!

Также (если кому поможет) нашел уловку: если есть какой-то метод типа init или add, то можно в нем отловить тип и запомнить (в качестве поля класса Вашей структуры), затем использовать в своем toArray() без лишних параметров (однако лишнее поле и каждый раз делаем дополнительное действие при инициализации/добавлении в Вашу произвольную коллекцию).

Типа такого:
Java
1
2
3
4
5
6
7
8
9
10
11
12
class YourCollection<T>
{
        private Class<T> className;
        // другие поля
 
        public void add(T value)
        {
              if (className == null)
                    className = (Class<T>) value.getClass();
              // дальнейшие действия
        }
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
24.06.2017, 22:50
Помогаю со студенческими работами здесь

Реализация с интерфейсом Comparable
Подскажите пожалуйста как правильно реализовать в Классе Megaphone сортировку с помощью интерфейса Comparable. Метод compareTo я...

Параметризация для интерфейса Comparable
Здравствуйте. Есть класс class Mark implements Comparable&lt;Mark&gt;{ double X = 0.0, Y = 0.0; Mark (double X, double Y){ ...

Интерфейс Comparable для шаблонов
Здравствуйте. Подскажите, пожалуйста, как реализовать метод сравнения для шаблона. Сравнение должно происходить по полю data. public...

Как реализовать Интерфейс Comparable
Добрый день подскажите пожалуйста: У меня есть коллекция фильмов, фильмы содержат: название, продюсер и категорию. Класс фильм я сделала...

Интерфейс Comparable для любого поля класса
Приветствую! Требуется выполнить сортировку массива объектов по любому из полей на выбор пользователя. Сабж: возможно ли это...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути
Programma_Boinc 01.01.2026
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути Сочетание глобально распределённой вычислительной мощности и инновационных. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru