我被困在特定的邏輯中。我有兩個數組,我需要檢查這兩個數組的值是否相等並且順序相同。循環也是允許的。假設:檢查兩個數組的值是否相等並且順序相同
array1 = {4, 3, 2, 1}
array2 = {1, 4, 3, 2} -- true.
array1 = {4, 3, 2, 1}
array2 = {2, 1, 4, 3} -- true.
數組值中允許重複。我無法將數組排序爲允許重複的數據,並且會擾亂數組順序。
我被困在特定的邏輯中。我有兩個數組,我需要檢查這兩個數組的值是否相等並且順序相同。循環也是允許的。假設:檢查兩個數組的值是否相等並且順序相同
array1 = {4, 3, 2, 1}
array2 = {1, 4, 3, 2} -- true.
array1 = {4, 3, 2, 1}
array2 = {2, 1, 4, 3} -- true.
數組值中允許重複。我無法將數組排序爲允許重複的數據,並且會擾亂數組順序。
你可以寫你的嵌套循環,但讓我們覺得有點不同。如果我們將第二個數組附加到自身,我們可以在第二個數組上執行第一個數組的「indexOf」操作。這是一個有點未經測試的代碼顯示的想法:
public static boolean arraysMatch(int[] array1, int[] array2) {
int[] combined = new int[array2.length * 2];
System.arraycopy(array2, 0, combined, 0, array2.length);
System.arraycopy(array2, 0, combined, array2.length, array2.length);
return Collections.indexOfSubList(Arrays.asList(combined), Arrays.asList(array1)) != -1;
}
還是比較列表爲中心的方法:
public static boolean arraysMatch(int[] array1, int[] array2) {
List<Integer> combined = new ArrayList<>(array2.length * 2);
List<Integer> array2List = Arrays.asList(array2);
combined.addAll(array2List);
combined.addAll(array2List);
return Collections.indexOfSubList(combined, Arrays.asList(array1)) != -1;
}
你可以做循環,而不是周圍的複製數據,但它的程序員時間與問題CPU時間。
編輯:我知道答案是可以接受的,但它還沒有真正完成。如果允許使用Apache Commons Lang中:https://commons.apache.org/proper/commons-lang/javadocs/api-2.6/org/apache/commons/lang/ArrayUtils.html
public static boolean arraysMatch(int[] array1, int[] array2) {
return Collections.indexOfSubList(
Arrays.asList(ArrayUtils.toObject(ArrayUtils.addAll(array2, array2))),
Arrays.asList(ArrayUtils.toObject(array1))
) != -1;
}
創意;代碼清晰度和性能之間的平衡很好。至少在Java 8中'Arrays.asList()'不接受'int'數組。 –
看起來可能需要手動填充列表
如果允許OP使用Commons Lang:http://commons.apache.org/proper/commons-lang/ ArrayUtils.toObject可以彌補差距:https://commons.apache.org/proper/commons-lang/ javadocs/api-2.6/org/apache/commons/lang/ArrayUtils.html#toObject%28int []%29 –
試試這個:
代碼:
import java.util.ArrayList;
import java.util.Arrays;
public class ArrayComparison {
// Create arrays
private static int[] array1 = new int[] {2,3,4,7,1};
private static int[] array2 = new int[] {2,3,4,7,1};
private static int[] array3 = new int[] {1,7,4,2,3};
private static int[] array4 = new int[] {1,2,3,4,5,6,7,8,9};
private static int[] array5 = new int[] {2,3,4,5,1};
public static void main(String args[]){
System.out.println(compareArrays(array1, array2)); // True
System.out.println(compareArrays(array1, array3)); // True
System.out.println(compareArrays(array1, array4)); // False
System.out.println(compareArrays(array1, array5)); // False
}
/**
* Compares if a1 is equal than a2, no matter the order
* @param a1 Array 1
* @param a2 Array 2
* @return True if a1 == a2, false if a1 != a2. no matter the order
*/
private static boolean compareArrays(int[] a1, int[] a2){
boolean areEqual=false;
// Clone
int[] a1Aux = a1.clone();
int[] a2Aux = a2.clone();
// Sort
Arrays.sort(a1Aux);
Arrays.sort(a2Aux);
// Compare
if(a1Aux.length == a2Aux.length){
for(int i=0;i<a1Aux.length;i++){
if(a1Aux[i] != a2Aux[i]){
return areEqual;
}
}
return true;
}
return areEqual;
}
}
輸出:
true
true
false
false
我懷疑它會在問題中被解決的兩個情況返回true。也許OP將能夠堅持嵌套循環考慮到這些。 –
@ OleV.V。你是對的,代碼編輯;) – Dani
這是簡單(但非常低效的,涉及到很多複製)。我堅持使用int
s的數組(沒有列表或其他集合,沒有Integer
對象)。
public static boolean arraysWrappedEqual(int[] array1, int[] array2) {
if (array1.length != array2.length) {
return false;
}
for (int array2startIndex = 0; array2startIndex < array2.length; array2startIndex++) {
// compare beginning of array1 with end of array2 and vice versa
int[] array1beginning = Arrays.copyOfRange(array1, 0, array1.length - array2startIndex);
int[] array1end = Arrays.copyOfRange(array1, array1.length - array2startIndex, array1.length);
int[] array2beginning = Arrays.copyOfRange(array2, 0, array2startIndex);
int[] array2end = Arrays.copyOfRange(array2, array2startIndex, array2.length);
if (Arrays.equals(array1beginning, array2end) && Arrays.equals(array1end, array2beginning)) {
return true;
}
}
return false;
}
它對於問題中的兩種情況都返回true。
迭代數組並檢查值 – Jobin
Java或Lua?已經選擇了你的選擇。 –
因此,您需要查看這些值是否以相同的順序排列,但是它們可以從數組中的任何一點開始並環繞? –