Как сделать объединение, пересечение, разность и обратные данные в java

Я хочу иметь операции объединения, пересечения, различия и обратные операции в Java.

Сначала у меня есть 2 экземпляра ArrayList

 a = [0,2,4,5,6,8,10] b = [5,6,7,8,9,10] 

союз b должен возвращать c = [0,2,3,4,5,6,7,8,9,10]

пересечение b должно возвращать c = [5,8,10]

дежурство b должно возвращать c = [0,2,3,4]

обратное a = [10,8,6,5,4,2,0]

Что-то вроде этого.

Как реализовать этот метод в Java?


Обновление : я должен начать с этого шаблона:

 package IntSet; import java.util.ArrayList; import java.util.Collection; public class IntSet { private ArrayList intset; public IntSet(){ intset = new ArrayList(); } public void insert(int x){ intset.add(x); } public void remove(int x){ //implement here intset.indexOf(x); } public boolean member(int x){ //implement here return true; } public IntSet intersect(IntSet a){ //implement here return a; } public IntSet union(IntSet a){ //implement here return a; } public IntSet difference(IntSet a){ //implement here IntSet b = new IntSet(); return b; } 

 //Union List c = new ArrayList(a.size() + b.size()); addNoDups(c,a); addNoDups(c,b); private void addNoDups(List toAddTo,List iterateOver) { for(Integer num:iterateOver){ if(toAddTo.indexOf(num) == -1) { toAddTo.add(num); } } } //intersection List c = new ArrayList (a.size() > b.size() ?a.size():b.size()); c.addAll(a); c.retainAll(b); //difference ab List c = new ArrayList (a.size()); c.addAll(a); c.removeAll(b); 

Во-первых, операции, которые вы описываете (кроме реверса), – это заданные операции, а не операции с списками, поэтому используйте HashSet или (если вам нужен заказ) TreeSet.

  Set a = new TreeSet(Arrays.asList(new Integer[]{0,2,4,5,6,8,10})); Set b = new TreeSet(Arrays.asList(new Integer[]{5,6,7,8,9,10})); //union Set c = new TreeSet(a); c.addAll(b); System.out.println(c); //intersection Set d = new TreeSet(a); d.retainAll(b); System.out.println(d); //difference Set e = new TreeSet(a); e.removeAll(b); System.out.println(e); //reverse List list = new ArrayList(a); java.util.Collections.reverse(list); System.out.println(list); 

Если вы используете Sets (как и следовало ожидать, для всех тех, кроме реверсов, являются операции Set), Guava предоставляет эти операции в своем classе Sets .

 Set union = Sets.union(set1, set2); Set intersection = Sets.intersection(set1, set2); Set difference = Sets.difference(set1, set2); 

Все это возвращает немодифицируемые представления, поддерживаемые оригинальными наборами.

См. Guava Explained -> Утилиты коллекции -> Наборы

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

 List list = new ArrayList<>(); // fill up list here Set set = new HashSet<>(list); 

Многие ответы говорят вам использовать библиотеки, которые будут работать для вас. Хотя это правильное решение для реального мира, помните, что вы делаете домашнее задание, и ваш учитель, вероятно, хочет, чтобы вы поняли, как написаны функции, а не только, как найти библиотеки для работы над вами.

Тем не менее, у вас есть хорошее начало с кодом, который вы показали. Возьмем проблему по одному шагу за раз.

Во-первых, знаете ли вы, где находится документация по Java? http://download.oracle.com/javase/1.4.2/docs/api/ это очень важно, так как вы узнаете, какие функции делают что. Вот ссылка на Java 1.4. Я не заметил, какую версию вы используете, но Java обратно совместима, поэтому этого должно быть достаточно.

В документах найдите запись ArrayList.

Теперь, когда у нас есть документы API, нам нужно сломать ваш вопрос. вы разместили код, поэтому я буду обращаться к нему с помощью функции.

insert (): вам нужно иметь упорядоченный список, или порядок не имеет значения? Или вы гарантированы, что значения будут предоставлены вам по порядку? Вы уже изучили алгоритмы сортировки?

remove (): эта функция не работает. посмотрите API ArrayList и посмотрите, как удалить элемент из списка. Используйте этот метод.

member (): ваш метод участника не работает. Вам нужно проверить каждую запись в списке и определить, соответствует ли текущий член аргументу функции. Вы узнали о циклах?

intersect (): ok, скажите мне на английском языке, что пересечение должно делать. Не используйте описание учителя, если вы можете помочь ему – используйте свои собственные слова (обратите внимание на других, это упражнение для OP, чтобы научиться программировать, поэтому, пожалуйста, не отвечайте на него за него)

Разница (): снова скажите мне, что это должно делать.

reverse (): снова дайте мне английское описание того, что это должно делать.

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

на этом этапе попробуйте преобразовать алгоритм в Java-код.

Этот fragment найдет объединение двух коллекций, используя метод apache commons CollectionUtils.union

 Collection totalFriends = CollectionUtils.union(yourFriends, myFriends); 

Я просто оставлю это здесь. Существует новый способ с java-8 и streams

 List listA = Arrays.asList(0, 2, 4, 5, 6, 8, 10); List listB = Arrays.asList(5, 6, 7, 8, 9, 10); List intersection = listA.stream() .filter(listB::contains) .collect(Collectors.toList()); List union = Stream.concat(listA.stream(), listB.stream()) .distinct().sorted() .collect(Collectors.toList()); List aDiffB = listA.stream() .filter(i -> !listB.contains(i)) .collect(Collectors.toList()); System.out.println(intersection); // [5, 6, 8, 10] System.out.println(union); // [0, 2, 4, 5, 6, 7, 8, 9, 10] System.out.println(aDiffB); // [0, 2, 4] 
  • Могу ли я выполнять арифметические операции над базовым classом Number?
  • Как десериализировать подclass в Firebase, используя getValue (Subclass.class)
  • Как я могу сделать ячейку в ListView в Android расширяться и сокращаться вертикально, когда ее касаются?
  • Как отформатировать продолжительность в java? (например, формат H: MM: SS)
  • как возобновить прерванный скачать
  • Как получить день месяца?
  • Как обновить информацию в Android-активности из фоновой службы
  • java.lang.NullPointerException: попытка вызвать виртуальный метод для ссылки на нулевой объект
  • в чем разница между i ++ и ++ i in for loop (Java)?
  • Отправить текст через Bluetooth от Java Server до Android Client
  • BitmapFactory.decodeStream возвращает значение null при настройке параметров
  • Interesting Posts

    Функция для динамического выделения матрицы

    Как предотвратить Windows Explorer от медленного чтения содержимого файла для создания метаданных?

    Получить общеansible / внешний IP-адрес?

    Нужно ли закрывать каждый вложенный OutputStream и Writer отдельно?

    Является ли хорошей практикой избегать использования состояния сеанса в ASP.NET MVC? Если да, то почему и как?

    Как получить абсолютный путь к текущей странице в Angular 2?

    java.lang.SecurityException: Permission Denial: не разрешено отправлять широковещательную версию android.intent.action.MEDIA_MOUNTED только на KitKat

    как преобразовать строку в дату в mysql?

    Как избежать обратного проектирования файла APK?

    Создание zip-файла на диске Google с помощью скрипта приложений

    Является ли std :: vector копированием объектов с помощью push_back?

    В чем преимущество использования $ () вместо обратных ссылок в сценариях оболочки?

    Запланированное и повторяющееся письмо в Outlook?

    Как загрузить любой файл и сохранить его в нужное место с помощью Selenium Webdriver

    Диалог для выбора изображения из галереи или с камеры

    Давайте будем гением компьютера.