我正在開發一個Android程序,它將使用手勢點比較手勢的相似性。我有兩個數組是這樣的:比較兩種不同長度的數組
gest_1 = [120,333,453,564,234,531]
gest_2 = [222,432,11,234,223,344,534,523,432,234]
我知道有沒有辦法來動態調整陣列中的任何一個,那麼,有沒有辦法,我用這些陣列比較這兩種手勢並返回相似?
請注意,數組中的數據只是隨機輸入的。
我正在開發一個Android程序,它將使用手勢點比較手勢的相似性。我有兩個數組是這樣的:比較兩種不同長度的數組
gest_1 = [120,333,453,564,234,531]
gest_2 = [222,432,11,234,223,344,534,523,432,234]
我知道有沒有辦法來動態調整陣列中的任何一個,那麼,有沒有辦法,我用這些陣列比較這兩種手勢並返回相似?
請注意,數組中的數據只是隨機輸入的。
你可以嘗試這樣的事:
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];
}
我認爲這大致是我正在尋找的想法。我不需要將值顯示在任何地方。如果數值幾乎相同,我只需將一個計數添加到變量或其他內容中。 – rach 2013-04-10 16:27:50
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 ...");
}
空間問題?如果沒有,您可以將其中一個數組存儲在散列表中,然後遍歷另一個數組,檢查該元素是否包含在散列表中。這將是O(n)而不是O(nm),但這也會增加算法的大小。
如果您無法做到這樣的事情,則需要兩個循環。外循環會在內循環增加整個第二個數組之後檢查第一個數組的索引,檢查元素是否相等。這可能是O(nm)。
上述想法假設當你說「相似性」時,這意味着一個數組中的任何元素都等於另一個數組中的任何其他元素。
使用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]);
}
}
試試這個功能,它返回數組: -
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;
}
我們consi der這樣的兩個數組
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]);
}
此代碼有效地工作。 – 2015-02-12 04:43:30
除了'array2'只有1個元素之外,看起來好像你在將'array2'中的第一個元素與'array1'中的第一個元素進行比較之後就已經脫離了循環。我不明白'j +'的長度檢查是甚麼。 – 2015-02-12 05:03:20
我認爲你需要更精確地定義'相似性'。 – Randy 2013-04-10 15:53:46
我在猜測,而不是元素相似性(所有的答案在這裏給出),你想要的運動的相似性(即而不是元素是完全相同的,你想他們之間的差異是類似[例如1,10類似於11,20]) – 2013-04-10 15:54:04
哎呀,對不起。我認爲通過相似性意味着特定數組索引中的元素應該具有幾乎爲零的差異。例如:gest_1 [0] - gest_2 [0] = 0 – rach 2013-04-10 16:25:34