2015-09-29 2 views
0

Есть ли способ вернуть массив в другой массив. У меня есть многомерный массив, который я использую метод combineArrays(Comparable[][] x) для объединения в другой массив 1D.Есть ли способ вернуть массив в другой массив?

Обычно я просто создавал массив 1D в более высокой области видимости, но мне было больно известно, что массивы Comparable нуждаются в измерении при инициализации, а combineArrays() отвечает за определение размера mutliarray.

Пожалуйста, будьте добры, я еще не закончил. Цель самой программы - принять массив объектов и найти общий список объектов, которые существуют в каждой строке. Трик является findCommonElements() должен делать это в любом O (NlogN) или O (N) времени

/* 
* combs through the original array to find the shortest row which must hold 
* the least # of common objects 
*/ 
public static int findSmallestRow(Comparable[][] queries) { 
    int array_length = 0; 
    int indexOfMaster = 0; 
    array_length = queries[0].length; // sets variable to initial arrays row 
             // length 
    for (int i = 0; i < queries.length; i++) { // iterates through each row 
               // comparing size of each 
               // row 
     if (queries[i].length <= array_length) { // ensures the 1st row is, 
                // at minimum, the 
                // master array 
      array_length = queries[i].length; 
      indexOfMaster = i; 

     } 

    } 
    return indexOfMaster; 
} 

public static void findCommonElements(Comparable[][] queries){ 
    Comparable[] new_query = combineArray(queries); 
    for(int a = 0; a<new_query.length; a++){ 
     System.out.println(new_query[a]); 
    } 
    //Arrays.sort(new_query); 
    int query_length = new_query.length; 
    int masterIndex = findSmallestRow(queries); 
    Comparable extracted[] = new Comparable[queries[masterIndex].length]; 
    System.arraycopy(queries[masterIndex], 0, extracted, 0, 
      extracted.length); 
    Comparable[] intermediate_query = new Comparable[masterIndex]; 

    int nonquery_length = extracted.length; 
    int counter = 0; 
    int counter2 = 0; 
    int query_index = 0; 
    int nonquery_index = 0; 
    int i =0; 
    int j = 0; 



    while(i < nonquery_length && j < query_length){ 
     if(extracted[nonquery_index].compareTo(new_query[query_index])>0){ 
      query_index++; 
     } 
     if(extracted[nonquery_index].compareTo(new_query[query_index])<0){ 
      nonquery_index++; 
     } 
     if(extracted[nonquery_index].compareTo(new_query[query_index])==0){ 
      counter++; 
      if(counter == queries.length){ 
       intermediate_query[counter2] = extracted[nonquery_index]; 
       counter2++; 
      } 

     } 
    } 
    Comparable common_list[] = new Comparable[counter2]; 

    for(int k = 0; k<counter2; k++){ 
     common_list[k] = intermediate_query[k]; 
     System.out.println(common_list[i]); 
    } 

} 

//gets size of query array, even if not uniform 
public static Comparable[] combineArray(Comparable[][]queries){ 
    int length = queries.length; 
    ArrayList rows = new ArrayList(); 

    for(int i = 0; i< length; i++){ 
     for(int k = 0; k<queries[i].length; k++){ 
      rows.add(""); 
     } 
    } 

    int query_size = rows.size(); 

    Comparable[] new_query = new Comparable[query_size]; 
    int new_query_counter = 0; 

    for(int i = 0; i< length; i++){ 
     for(int k = 0; k<queries[i].length; k++){ 
      new_query[new_query_counter] = queries[i][k]; 
     } 
    } 

return new_query; 
} 
+0

Любой образец ввода/вывода или более кода увеличит ваши шансы получить осмысленный ответ (и не будет закрыт). –

+0

Здесь нет ничего особенного в сравнении. Да, вам нужно будет определить, насколько большой должен быть ваш массив - или поместить все элементы в 'ArrayList', которые будут расти, как нужно, а затем вызвать' toArray'. Где именно вы застряли? Разве это «объединение» просто материи или сглаживания? –

+0

Использование arraylist поражает точку сравнения –

ответ

0

Это вычисляет пересечение множеств всех строк массива.

public static Set<Comparable<?>> common(Comparable<?>[][] a){ 
    Set<Comparable<?>> inter = new HashSet<>(Arrays.asList(a[0])); 
    for(int i = 1; i < a.length; ++i){ 
     inter.retainAll(new HashSet<>(Arrays.asList(a[i]))); 
    } 
    return inter; 
} 

Вполне возможно, что первоначальная идея состоит в том, чтобы сохранить повторяющиеся элементы, то есть, если есть два «X» в каждой строке, результат должен также содержать два «х». В приведенном коротком решении слышны множества, которые не сохраняют повторение равных элементов. - Но вот библиотека, где вы найдете HashMultiSet, и код останется в основном одинаковым, за исключением типов inter и result.

import org.apache.commons.collections4.multiset.HashMultiSet;