簡體   English   中英

比較Java中char數組的兩個區域,而無需創建新對象

[英]Compare two regions of char array in Java without creating new objects

有沒有一種方法可以比較Java中char數組(或兩個不同數組)的兩個區域,而無需在堆中創建新對象?

我知道我可以做這樣的事情:

char[] region1 = Arrays.copyOfRange(bigbuffer,0,100);
char[] region2 = Arrays.copyOfRange(bigbuffer,100,200);

if (Arrays.equals(region1,region2))
   System.out.printf("Equal");

但這將創建兩個對象,這些對象隨后必須被垃圾回收並遍歷兩次數組緩沖區。 如果有一個可以比較兩個區域的函數,那就更好了。 我想象這樣的事情:

if (Arrays.compareRegions(bigBuffer,0,100,bigBuffer,100,200)==0)
    System.out.printf("Equal");

Java中有這樣的事情嗎?

您不必創建新的數組-一個for循環就足夠了。

for(int i=0; i < 100; i++) {
   if (bigbuffer[i] != bigbuffer[i+100]) {
       System.out.println("Not Equal");
       break;
   }
}

進行了快速搜索,並且至少在Java和最著名的幫助程序庫(Commons Lang和Guava)中似乎沒有內置的解決方案。

自己寫一個書應該很簡單。 這是一個進行偽比較(而不是比較)的示例(偽代碼)。 增強它以滿足您的需求

public static <T> boolean arrayEquals(T[] arr1, int startIndex1, T[] arr2, int startIndex2, int lengthToCompare) {
    if (arr1 == null || arr2 == null) {
        throws new NullPointerException();
    }
    if (arr1.length - lengthToCompare < startIndex1 
      || arr2.length - lengthToCompare < startIndex2) {
        throw new ArrayIndexOutOfBoundException();
    }
    // some extra checking like startIndex > 0 etc.

    // This is the real logic anyway
    for (int i = 0; i < lengthToCompare; ++i) {
        if (! Objects.equals(arr1[startIndex + i], arr2[startIndex2 + i]) {
            return false;
        }
    }
    return true;
}

如果不處理原始類型數組,另一種僅在堆中創建幾個小對象的方法是:

Foo[] arr1 = ....;
Foo[] arr2 = ....;

if (Arrays.asList(arr1).subList(0,100).equals(
        Arrays.asList(arr2).subList(100,200)) {
    ....
}

這取決於以下屬性:

  1. Arrays.asList()返回一個List Arrays.asList()式方法由輸入數組內部備份
  2. subList()返回原始列表的視圖,而不是副本

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM