比较两种不同长度的数组

时间:2013-04-10 15:46:55

标签: java android arrays similarity

我正在Android上开发一个程序,它将使用手势点比较手势的相似性。我有两个这样的数组:

gest_1 = [120,333,453,564,234,531]
gest_2 = [222,432,11,234,223,344,534,523,432,234]

我知道没有办法动态调整其中一个数组的大小,所以我有什么方法可以使用这些数组比较这些手势并返回相似性吗?

请注意,数组中的数据只是随机输入的。

6 个答案:

答案 0 :(得分:5)

使用HashSet。对于两个列表的联合,

HashSet<Integer> hashSet = new HashSet<>(); // Contains the union
for(int i = 0; i < array1.length; i++)
    hashSet.add(array1[i]);
for(int i = 0; i < array2.length; i++)
    hashSet.add(array2[i]);

对于两个列表的交集,

HashSet<Integer> hashSet = new HashSet<>();
List<Integer> list = new ArrayList<>();  // Contains the intersection
for(int i = 0; i < array1.length; i++)
    hashSet.add(array1[i]);
for(int i = 0; i < array2.length; i++) {
    if(hashSet.contains(array2[i])) {
        list.add(array2[i]);
    }
}

答案 1 :(得分:1)

您可以尝试这样的事情:

  List similarities = new ArrayList();
  for(int i = 0; i < Math.max(gest_1.length, gest_2.length); i++){
    if (gest_1[i] == gest_2[i])
       similarities.add(gest_1[i];
  }

答案 2 :(得分:1)

尝试此函数返回数组: -

public static String[] numSame (String[] list1, String[] list2) 
     {  
          int same = 0;  
          for (int i = 0; i <= list1.length-1; i++) 
          {  
             for(int j = 0; j <= list2.length-1; j++) 
             {  
                if (list1[i].equals(list2[j])) 
                {  
                    same++;  
                    break;  
                }  
             }  
          }  

          String [] array=new String[same];
          int p=0;
          for (int i = 0; i <= list1.length-1; i++) 
          {  
             for(int j = 0; j <= list2.length-1; j++) 
             {  
                if (list1[i].equals(list2[j])) 
                {  
                    array[p]=  list1[i]+"";
                    System.out.println("array[p] => "+array[p]);
                    p++;
                    break;  
                }  
             }  
          } 
          return array;
       }  

答案 3 :(得分:0)

        int temp = 0;
        int[] gest_1 = {120, 333, 453, 564, 234, 531};
        int[] gest_2 = {222, 432, 11, 234, 223, 344, 534, 523, 432, 234};
        ArrayList<Integer> g1 = new ArrayList<>();
        ArrayList<Integer> g2 = new ArrayList<>();

        for (int i : gest_1) {
            g1.add(i);
        }
        for (int i : gest_2) {
            g2.add(i);
        }
        for (int i : gest_1) {
            if (g2.contains(i)) {
                temp++;
            }
//            else{
//                break;
//            }
        }

        System.out.println(temp + " element(s) are equal ...");
    }

答案 4 :(得分:0)

空间重要吗?如果没有,您可以将其中一个数组存储在哈希表中,然后遍历另一个数组,检查该元素是否包含在哈希表中。这将是O(n)而不是O(nm),但这也会增加算法的大小。

如果你不能做这样的事情,那就需要两个循环。在内循环通过整个第二个数组递增后检查元素是否相等,外循环将增加第一个数组的索引。这可能是O(nm)。

上述想法假设当你说“相似性”时,它意味着一个数组中的任何元素都等于另一个数组中的任何其他元素。

答案 5 :(得分:-2)

我们认为这两个阵列是这样的 int [] array1 = {3,5,4,2,6,1,7,9,8};         int [] array2 = {1,2,3,4,8};

我们的目标是找到类似的价值观。

    int[] res;

    if(array1.length>array2.length){
         res=new int[array2.length];
    }else{
        res=new int[array1.length];
    }

      int k=0;

    for(int i=0;i<array1.length;i++)
            {
            for(int j=0;j<array2.length;j++)
                {
                    if(array1[i]==(array2[j]))
                        {
                        res[k]=array1[i];
                            k++;
                            break;

                       }

                }
            }

    for(int l=0;l<res.length;l++){


        System.out.print(res[l]);

    }