Союз 2-х массивов в Java? - PullRequest
3 голосов
/ 28 апреля 2011

Мой код

class Union {

    //Search Function
    static boolean search(int A[], int i) {

        for (int k = 0; k < A.length; k++) {
            if (A[k] == i) {
                return true;
            }
        }
        return false;
    }

    //union
    static void union(int A[][], int B[][]) {

        int i = 0;
        int count = 0;
        int C[] = new int[A.length + B.length];

        for (; i < A.length; i++) {
            if (!(search(B, A[i]))) {
                C[count] = A[i];
                count++;
            }
        }

        for (; i < (A.length + B.length); i++) {
            C[count] = B[i - A.length];
            count++;
        }

        System.out.println("This is Union Of 2 D Array ");
        System.out.println();

        for (int k = 0; k < count; k++) {
            System.out.println(C[k]);
        }
        System.out.println();

    }

    public static void main(String... s) {
        union(new int[]{1, 1, 1, 4,}, new int[]{1, 4, 4, 4, 1, 2});
    }
}

Я использую этот вывод, чтобы найти объединение двумерного массива. Но вывод, который я получаю, неверен.Я не хочу 2 использовать какой-либо предопределенный интерфейс и метод в Java.мой ответ должен быть {1,2,4}

Пример

A= {1,2,3,3}
B={2,3,1,1}
c={1,2,3}

Ответы [ 8 ]

9 голосов
/ 30 марта 2012

Это то, что вы ищете:

import java.util.Arrays;

public class Union
{

    public static void main(String[] args)
    {
        int[] A = {1, 2, 3, 3};
        int[] B = {2, 3, 1, 1};
        System.out.println(Arrays.toString(unionArrays(A, B)));
    }

    /* Union of multiple arrays */
    public static int[] unionArrays(int[]... arrays)
    {
        int maxSize = 0;
        int counter = 0;

        for(int[] array : arrays) maxSize += array.length;
        int[] accumulator = new int[maxSize];

        for(int[] array : arrays)
            for(int i : array)
                if(!isDuplicated(accumulator, counter, i))
                    accumulator[counter++] = i;

        int[] result = new int[counter];
        for(int i = 0; i < counter; i++) result[i] = accumulator[i];

        return result;
    }

    public static boolean isDuplicated(int[] array, int counter, int value)
    {
        for(int i = 0; i < counter; i++) if(array[i] == value) return true;
        return false;
    }
}

ВЫХОД:

[1, 2, 3]
8 голосов
/ 28 апреля 2011

Конкретно не отвечая на ваш вопрос, но если вы на самом деле просто хотите получить объединение, вам, вероятно, следует использовать интерфейс java Set .Подробнее см. здесь .

4 голосов
/ 31 марта 2012

Комплект - это естественный выбор, когда вы хотите уникальности. Чтобы избежать большого количества конверсий, вы можете перейти с int[] на Integer[] и получить очень короткий и чистый метод объединения.

Вот полный рабочий пример:

import java.util.*;

public class Union {
  // Search Function
  public boolean search(Integer a[], Integer i) {
    for(int k = 0; k < a.length; k++) {
      if(a[k] == i) {
        return true;
      }
    }
    return false;               
  }

  // Union
  public void union(Integer[] a, Integer[] b) {
    Set<Integer> set = new HashSet<Integer>(Arrays.asList(a));
    set.addAll(Arrays.asList(b));
    Integer[] unionArray = set.toArray(new Integer[set.size()]); 
    System.out.println(Arrays.toString(unionArray));
  }

  public static void main(String...s) {
    Integer[] array1 = new Integer[]{1,1,1,4,};
    Integer[] array2 = new Integer[]{1,4,4,4,1,2};
    new Union().union(array1, array2);
  }
}

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

Использование Set также позволяет избежать распространенной ошибки, когда вы перебираете массив для поиска элемента, чтобы убедиться, что добавляемый вами элемент не является дубликатом. Обычно такие решения имеют O (n ^ 2) временную сложность (см. this ).

Это не будет проблемой, если ваши массивы состоят из 10 элементов, но если у вас есть два массива, скажем, по 1000 уникальных элементов в каждом, вы будете выполнять много ненужных прогулок, делая ваш код очень медленным. В этом случае в решении на основе массива с проверкой дубликатов путем обхода массива вам потребуется выполнить 1000 * 1000/2 = 500 КБ операций, в то время как на основе набора будет около 5 КБ:

  • 1000 для преобразования первого массива в список,
  • 1000 для преобразования списка в набор,
  • 1000 для преобразования второго массива в список,
  • 1000 для добавления второго массива в набор и
  • 1000, чтобы преобразовать его обратно из набора в массив)

в качестве решения на основе множеств - O (n). Если вы предполагаете, что эти операции примерно одинаковы (не правда, но, тем не менее, это не плохое приближение), это в 100 раз быстрее.

Более того, это увеличивается быстро с увеличением количества уникальных элементов - для 10K элементов в каждом из массивов решение для обхода на основе массива может принять порядка 50 000 000 операций, а решение на основе набора - на 15 000. .

Надеюсь, это поможет.

1 голос
/ 30 марта 2012

A = {1,1,1,4} B = {1,4,4,4,1,2}

Математически объединение множеств A и B будет C = {1,4,2}

или вы хотите повторение, например, C = {1,1,1,1,1,2,4,4,4,4}

Какой ваш ожидаемый результат? первый или второй?

public class Union_2{
static int size;

public static void main(String [] args){
int [] a = {1,1,1,4};
int [] b = {1,4,4,4,1,2};
int [] c = Union_finder(a,b);
for(int i = 0 ; i< size ; i++){
  System.out.print(c[i]+" ");
}
}
public static int[] Union_finder(int [] a,int [] b){
int [] c = new int[a.length+b.length];
int i=0,j=0,k=0;
for(;i<a.length;i++){
  boolean bool = check(a[i],c);
  if( bool == false){
    c[k] = a[i];
    size++;
    k++;
  }
}
for(;j<b.length;j++){
  boolean bool = check(b[j],c);
  if( bool== false){
    c[k] = b[j];
    size++;
    k++;
  }
}
return c ;
}
public static boolean check(int x,int [] c){
if(size == 0){
  return false;
}
else{
  for(int i = size - 1 ; i >= 0 ; i--){
    if( c[i] == x){
      return true ;
    }
  }
}
return false ;
}
}
1 голос
/ 28 апреля 2011

Код, который вы разместили, имеет дело с 1d массивами, а не 2d =) Код, похоже, пытается объединить содержимое двух массивов в другой массив Для этого просто сделайте следующее:

public static int[] joinArrays(int[] a, int[] b) {
    if (a == null || b == null)
        throw new IllegalArgumentException("Both arrays must be non-null");
    int c[] = new int[a.length + b.length];
    System.arraycopy(a, 0, c, 0, a.length);
    System.arraycopy(b, 0, c, a.length, b.length);
    return c;
}
0 голосов
/ 27 ноября 2018
    Set<String> set = new HashSet<>(list1);
    set.addAll(list2);
    List<String> union = new ArrayList<>(set);
0 голосов
/ 19 октября 2016
 public static int[] arrayUnion(int a1[], int a2[]){
        int[] resultArray={};
        ArrayList<Integer> arrayList = new ArrayList<Integer>();

        if(a1.length>a2.length){
            resultArray=new int[a1.length];
        }else resultArray=new int[a2.length];

        for(int element : a1){
            arrayList.add(Integer.valueOf(element));

        }
        for(int element:a2){
            if(! arrayList.contains(element)){
                arrayList.add(Integer.valueOf(element));
            }
        }

        resultArray = arrayList.stream().mapToInt(i->i).toArray(); // only in java 8
       return  resultArray;

    }
0 голосов
/ 25 ноября 2012

// Я надеюсь, что этот пример будет простым. // передаем два массива, и вы обязательно получите UNION массива без дублирующих элементов.

public class UnionOfArrays 
{</p>

<code>public int[] getUnion(int[] arr1, int[] arr2)
{
    int[] array = MergeSort.mergeArray(arr1, arr2);
    int[] arrReturn = getunique(array);
    return arrReturn;
}   
public int[] getunique(int[] array)
{
    int[] arrTemp = new int[array.length];
    int[] arrReturn;
    int index = 0;
    for (int i = 0; i < array.length; i++)
    {
        Boolean found = false;
        for (int j = 0; j < i; j++)
        {
            if (array[i] == array[j])
            {
                found = true;
                break;
            }
        }
        if (!found)
        {
            arrTemp[index++] = array[i];
        }
    }
    arrReturn = new int[index];
    for (int i = 0; i < index; i++)
    {
        arrReturn[i] = arrTemp[i];
    }
    return arrReturn;
}}
</code>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...