Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.77/13: Рейтинг темы: голосов - 13, средняя оценка - 4.77
0 / 0 / 0
Регистрация: 25.10.2014
Сообщений: 39
1

Пересечение списков в java

01.06.2016, 10:35. Показов 2460. Ответов 3
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброго времени суток. После перехода с C++ на JAVA cтолкнулся с проблемой, не знаю куда засунуть часть кода, и как его запустить. Задание: получить пересечение двух списков.

Вот сама программа, описан класс list, и созданы объекты.
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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
package spisok;
 
/**
 *
 * @author komarov
 */
public class Spisok {
    
 
   
    public static void main(String[] args) {
        List ml = new List();
        ml.addBack(1);
        ml.addBack(2);
        ml.addBack(3);
        ml.addFront(6);
 
        ml.printList();
        System.out.println();
        
        List m2 = new List();
        m2.addBack(3);
        m2.addBack(2);
        m2.addBack(4);
        m2.addFront(6);
 
        m2.printList();
        System.out.println();
        
        getIntersectionNode(m1,m2);
    }
    
}
 
class ListElement {
    ListElement next;    // указатель на следующий элемент
    int data;   // данные
     
}
 
class List {
    private ListElement head;       // указатель на первый элемент
    private ListElement tail;       // указатель последний элемент
 
    void addFront(int data)           //добавить спереди
    {
        ListElement a = new ListElement();  //создаём новый элемент
        a.data = data;              //инициализируем данные. 
                                    // указатель на следующий элемент автоматически инициализируется как null
        if(head == null)            //если список пуст
        {                           //то указываем ссылки начала и конца на новый элемент
            head = a;               //т.е. список теперь состоит из одного элемента
            tail = a;
        }
        else {
            a.next = head;          //иначе новый элемент теперь ссылается на "бывший" первый
            head = a;               //а указатель на первый элемент теперь ссылается на новый элемент 
        }
    }
 
    void addBack(int data) {          //добавление в конец списка
        ListElement a = new ListElement();  //создаём новый элемент
        a.data = data;
        if (tail == null)           //если список пуст
        {                           //то указываем ссылки начала и конца на новый элемент
            head = a;               //т.е. список теперь состоит из одного элемента
            tail = a;
        } else {
            tail.next = a;          //иначе "старый" последний элемент теперь ссылается на новый
            tail = a;               //а в указатель на последний элемент записываем адрес нового элемента
        }
    }
 
    void printList()                //печать списка
    {
        ListElement t = head;       //получаем ссылку на первый элемент   
        while (t != null)           //пока элемент существуе
        {
            System.out.print(t.data + " "); //печатаем его данные
            t = t.next;                     //и переключаемся на следующий
        }
    }
 
    void delEl(int data)          //удаление элемента
    {
        if(head == null)        //если список пуст - 
            return;             //ничего не делаем
 
        if (head == tail) {     //если список состоит из одного элемента
            head = null;        //очищаем указатели начала и конца
            tail = null;
            return;             //и выходим
        }
 
        if (head.data == data) {    //если первый элемент - тот, что нам нужен
            head = head.next;       //переключаем указатель начала на второй элемент
            return;                 //и выходим
        }
 
        ListElement t = head;       //иначе начинаем искать
        while (t.next != null) {    //пока следующий элемент существует
            if (t.next.data == data) {  //проверяем следующий элемент
                if(tail == t.next)      //если он последний
                {
                    tail = t;           //то переключаем указатель на последний элемент на текущий
                }
                t.next = t.next.next;   //найденный элемент выкидываем
                return;                 //и выходим
            }
            t = t.next;                //иначе ищем дальше
        }
    }
    
}
Вот готовый кусок кода для поиска пересечения.

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
36
public class Solution {
    public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
        if (headA == null || headB == null) {
            return null;
        }
        int length1 = 0, length2 = 0, diff = 0;
        ListNode list1 = headA, list2 = headB;
        while (list1 != null) {
            length1++;
            list1 = list1.next;
        }
        while (list2 != null) {
            length2++;
            list2 = list2.next;
        }
        list1 = headA;
        list2 = headB;
        diff = length1 - length2;
        if (length2 > length1) {
            list1 = headB;
            list2 = headA;
            diff = length2 - length1;
        }
        for (int i = 0; i < diff; i++) {
            list1 = list1.next;
        }
        while (list1 != null && list2 != null) {
            if (list1.val == list2.val) {
                return list1;
            }
            list1 = list1.next;
            list2 = list2.next;
        }
        return null;
    }
}
Как его использовать в моей программе?

Добавлено через 20 часов 23 минуты
Ну что, ни кто не сможет помочь ?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
01.06.2016, 10:35
Ответы с готовыми решениями:

Пересечение списков
Напишите функцию (f X Y), которая возвращает список Z - &quot;пересечение&quot; списков X и Y, т.е. список,...

Пересечение списков
Определить пересечение списков, например есть , пересечение это . Помогите пожалуйста разобраться,...

Пересечение списков.
Добый день. Вот немогу никак допереть: Есть два поля на форме: field1 и field2, оба они...

Пересечение списков
Для примера есть 2 списка: a= b= Программа должна вывести индекс (номер) одинаковых элементов из...

3
323 / 310 / 206
Регистрация: 14.09.2015
Сообщений: 827
01.06.2016, 11:15 2
komarov1, я, конечно, дико извиняюсь но Вам обязательно нужно собрать подобную конструкцию из дискретных элементов? Готовые решения Вас не устроят? Если использовать некоторые возможности Java, то решение может выглядеть несколько проще (рабочий прототип):
Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class CrossingList{
    public static List getCrossingList(List<String> listOne, List<String> listTwo)
    {
        List<String> result = new ArrayList<>();
        for(String temp : listOne){
            for(String tmp : listTwo){
                if(temp.equalsIgnoreCase(tmp)){
                    result.add(temp);
                }
            }
        }
        Collections.sort(result);
        return result;
    }
 
    public static void main(String[] args)
    {
        List<String> list1 = Arrays.asList("Ситроен", "Рено", "Бугатти", "Запорожец", "Мини", "Фиат", "Мерседес");
        List<String> list2 = Arrays.asList("Порше", "Москвич", "Запорожец", "Рено", "Мазда", "Субару", "Сеат");
        System.out.println(getCrossingList(list1, list2));
    }
}

Разбирать код прикидывать куда и чего пристроить как-то времени не хватает. Если принципиально нужно именно то, что Вы выложили привести в рабочее состояние, то это уже позже, гораздо позже...
0
0 / 0 / 0
Регистрация: 25.10.2014
Сообщений: 39
01.06.2016, 13:50  [ТС] 3
К сожалению, нужно решение без "стандартных" ухищрений в JAVA
0
323 / 310 / 206
Регистрация: 14.09.2015
Сообщений: 827
02.06.2016, 13:46 4
komarov1,
Цитата Сообщение от komarov1 Посмотреть сообщение
Как его использовать в моей программе?
- я посмотрел предложенные фрагменты программы. Поскольку в наличествуют не все компоненты, о работоспособности сказать ни чего не могу, а что касается ответа на вопрос, то просматривается единственных вариант:
Java
1
2
        Solution sol = new Solution();
        sol.getIntersectionNode(ml, m2);
Проверяйте, пробуйте...
Удачи!
0
02.06.2016, 13:46
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
02.06.2016, 13:46
Помогаю со студенческими работами здесь

Пересечение списков-множеств
Здравствуйте, помогите, пожалуйста, решить задачу. Заранее благодарна. Определите функцию,...

Пересечение списков-множеств
Здравствуйте, помогите, пожалуйста, решить задачу. Заранее благодарна. Определите функцию,...

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

Пересечение связанных списков
Здравствуйте, нужна помощь в написании метода для класса MyLinkedList, который получает на вход 2...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru