Как сделать объединение, пересечение, различие и обратное данные в Java - PullRequest
50 голосов
/ 28 августа 2010

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

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

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<Integer> intset;

public IntSet(){
    intset = new ArrayList<Integer>();
}

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; 
}

Ответы [ 6 ]

74 голосов
/ 28 августа 2010

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

    Set<Integer> a = new TreeSet<Integer>(Arrays.asList(new Integer[]{0,2,4,5,6,8,10}));
    Set<Integer> b = new TreeSet<Integer>(Arrays.asList(new Integer[]{5,6,7,8,9,10}));

    //union
    Set<Integer> c = new TreeSet<Integer>(a);
    c.addAll(b);
    System.out.println(c);

    //intersection
    Set<Integer> d = new TreeSet<Integer>(a);
    d.retainAll(b);
    System.out.println(d);

    //difference
    Set<Integer> e = new TreeSet<Integer>(a);
    e.removeAll(b);
    System.out.println(e);

    //reverse
    List<Integer> list = new ArrayList<Integer>(a);
    java.util.Collections.reverse(list);
    System.out.println(list);
41 голосов
/ 28 августа 2010
//Union 
List<Integer> c = new ArrayList<Integer>(a.size() + b.size());
addNoDups(c,a);
addNoDups(c,b);

private void addNoDups(List<Integer> toAddTo,List<Integer> iterateOver) {
    for(Integer num:iterateOver){
        if(toAddTo.indexOf(num) == -1) {
            toAddTo.add(num);
        }
    }
}

//intersection
List<Integer> c = new ArrayList<Integer> (a.size() > b.size() ?a.size():b.size());
c.addAll(a);
c.retainAll(b);

//difference a-b
List<Integer> c = new ArrayList<Integer> (a.size());
c.addAll(a);
c.removeAll(b);
26 голосов
/ 04 августа 2016

Если вы используете Наборы (как и должно быть, все операции, кроме обратного, являются операциями Набора), Гуава предоставляет эти операции в Sets класс.

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

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

См. Объяснение Гуавы -> Collection Utilities -> Наборы

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

List<X> list = new ArrayList<>();
// fill up list here
Set<X> set = new HashSet<>(list);
9 голосов
/ 29 августа 2010

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

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

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

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

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

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

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

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

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

разница (): снова, скажите мне по-английски, что он должен делать.

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

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

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

3 голосов
/ 22 февраля 2017

В этом фрагменте будет найдено объединение двух коллекций с использованием метода apache commons CollectionUtils.union

Collection<String> totalFriends = CollectionUtils.union(yourFriends, myFriends);
2 голосов
/ 06 ноября 2017

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

List<Integer> listA = Arrays.asList(0, 2, 4, 5, 6, 8, 10);
List<Integer> listB = Arrays.asList(5, 6, 7, 8, 9, 10);

List<Integer> intersection = listA.stream()
        .filter(listB::contains)
        .collect(Collectors.toList());

List<Integer> union = Stream.concat(listA.stream(), listB.stream())
        .distinct().sorted()
        .collect(Collectors.toList());

List<Integer> 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]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...