Подтвердить что ты не робот

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

Я хочу иметь объединения, пересекающиеся, разностные и обратные операции в 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]

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

reverse 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; 
}
4b9b3361

Ответ 1

//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);

Ответ 2

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

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

Ответ 3

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

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

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

См. Объяснение Guava Утилиты коллекции Наборы

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

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

Ответ 4

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

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

Во-первых, вы знаете, где находится документация по 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, чтобы научиться программировать, поэтому, пожалуйста, не отвечайте на него за него)

difference(): еще раз скажите мне, что он должен делать.

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

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

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

Ответ 5

Я просто оставлю это здесь. Существует новый способ: 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]

Ответ 6

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

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