人間のやり方:
最初の配列を反復処理し、2番目の配列に各要素が存在するかどうかを確認してから、最初の配列の2番目の配列に対して同じことを行います。時間:n^2。このメソッドは、要素が繰り返されないことを前提としていることに注意してください。もしそうなら、チェックしている要素ごとに、最初に戻ってその要素のインスタンスの数を数えなければなりません(たとえばX)、そして成功はX番目の要素を見つけることとしてのみ数えます2番目の配列。これを行うと、2回目のチェックが不要になり、読者の練習問題として残されます(もしあなたがそんなに傾いているなら、それはそうです)。
boolean equal(String[] arr1, String[] arr2) {
if(arr1.length != arr2.length) return false; // obviously
main_loop:
for(int i = 0; i < arr1.length; i++) {
for(int j = 0; j < arr2.length; j++) {
if(arr1[i].equals(arr2[j]))
break main_loop;
}
return false;
}
main_loop:
for(int i = 0; i < arr2.length; i++) {
for(int j = 0; j < arr1.length; j++) {
if(arr2[i].equals(arr1[j]))
break main_loop;
}
return false;
}
// having got through both loops, we can now return true
}
より高度な方法:両方の配列を並べ替えて、両方を調べます。時間:n lg n
boolean equals(String[] arr1, String[] arr2) {
if(arr1.length != arr2.length) return false;
String[] copy1 = Arrays.copyOf(arr1,arr1.length); // java.util.Arrays
String[] copy2 = Arrays.copyOf(arr2,arr2.length); // java.util.Arrays
Arrays.sort(copy1);
Arrays.sort(copy2);
for(int i = 0; i < copy1.length; i++) {
if(!copy1[i].equals(copy2[i])
return false;
}
return true;
}
さらに高度な方法:ハッシュマップを使用して、最初の文字列配列のカウントを追加し、2番目の文字列配列のカウントを削除します。あなたがodneであるとき、すべてのカウントはゼロでなければなりません。
boolean equal(String[] arr1, String[] arr2) {
if(arr1.length != arr2.length) return false;
Map<String, Integer> map1 = new HashMap<String,Integer>();
for(String str : arr1) {
if(!map.containsKey(str)) {
map.put(str, 1);
} else {
map.put(str, map.get(str) + 1); // add to count inthe map
}
}
for(String str : arr1) {
if(!map.containsKey(str)) {
return false; // we have an element in arr2 not in arr1 - leave now
} else {
map.put(str, map.get(str) - 1); // remove to count inthe map
}
}
for(Integer count : map.values()) {
if(count.intValue() != 0) return false;
}
return true;
}