2011-09-28 88 views
1

我正在做一個應用程序,我想在字符數組中找到一個特定的字符。換句話說,我有以下的字符數組:在字符數組中找到一個特定的字符

char[] charArray= new char[] {'\uE001', '\uE002', '\uE003', '\uE004', '\uE005', '\uE006', '\uE007', '\uE008', '\uE009'}; 

在某一點上,我要檢查,如果字符'\uE002'charArray存在。我的方法是對charArray中的每個字符進行循環,並查找它是否存在。

for (int z = 0 ; z < charArray; z ++) { 
    if (charArray[z] == myChar) { 
     //Do the work 
    } 
} 

是否有任何其他的解決方案,而不是通過循環每個字符的char數組和查找字符?

+0

只有哈希能做到這一點更快其他的解決辦法。但是,如果你的char數組不大於10000字符,這個逐字符檢查應該做得相當快。 – Cipi

+0

無論是字符還是數組都不變,簡單來說就是永遠不會改變?甚至不經常改變? –

+0

您的優先事項是什麼?你在尋找更快,還是更簡單,還是......? –

回答

3

一個選項是預sortcharArray並使用Arrays.binarySearch(charArray, myChar)。非負的返回值將表示存在於charArray中。

char[] charArray = new char[] {'\uE001', '\uE002', '\uE003', '\uE004', '\uE005', '\uE006', '\uE007', '\uE008', '\uE009'}; 
Arrays.sort(charArray); // can be omitted if you know that the values are already sorted 
... 
if (Arrays.binarySearch(charArray, myChar) >= 0) { 
    // Do the work 
} 

編輯避免使用Arrays模塊另一種方法是把字符轉換成字符串(在初始化時),然後使用String.indexOf()

String chars = "\uE001..."; 
... 
if (chars.indexOf(myChar) >= 0) { 
    // Do the work 
} 

這不是巨大的差別是什麼你已經在做,除了它需要更少的代碼。

如果n的尺寸爲charArray,則第一個解決方案爲O(log n),而第二個解決方案爲O(n)

+2

不幸的是'陣列'Java ME中不可用。 – bharath

+0

Weeelll ...'indexOf'與字符串中的循環做同樣的事情。它這樣做'if(this.charAt(k)== ch)return k;'。 – Cipi

+0

使它成爲一個字符串,並在這種情況下使用'indexOf(char)'太慢或不適當?否則,這將是最好的選擇 –

1

您可以使用散列/映射來檢查字符的存在。根據散列/映射內部結構,此方法具有更好的O(log n)或O(1)時間。

-2

如果你不想自己實現它,你可以使用的Apache Commons項目ArrayUtils:

ArrayUtils apache-commons

+1

忽略這個答案沒有看到它是爲黑莓ME。 –

1

如果您沒有訪問陣列,因爲你是在工作的JavaME,那麼你應該嘗試:

  • 或實現有序數組和二進制搜索youself
  • 或者只是使用一個O(n)的解決方案,是至極反正一個很好的解決方案。

您的解決方案是O(n)以及aix所述的解決方案。

您可以嘗試使用Map,但這取決於您在陣列中有多少元素。如果您認爲陣列中不會超過1000個元素,只需使用O(n)解決方案。但是如果你認爲你可以有一個未知的元素數量,一個地圖將是一個可供選擇的選擇,提供更好的解決方案。

+0

O(n)是什麼意思 –

+1

O(n)是一種解決方案,它提供最多n步內的答案,其中n是您擁有的對象的數量。在這種情況下,n將是數組的大小。例如,如果你的數組有570個元素,這裏的答案會在你的算法的最多570次迭代中出現。 O(n)解決方案通常很好,但是如果你有一個大的N(1k +),你可以嘗試改進它。但這一切都取決於您的業務。如果您要搜索很多,但不會包含太多內容,則在O(log n)的排序數組中進行二進制搜索將是完美的。否則,請考慮使用地圖。 – SHiRKiT

+0

或者如果你真的想研究這一點,你可以實現所有這些解決方案並描述你的應用,看看最好的。但是,當然,對於大N來說Map和二進制搜索在一個Sorted數組中將會是更快的,但是如果你不知道N有多大,有時候浪費那麼多時間去查看一些東西是不值得的。在這種情況下,我會堅持地圖。 – SHiRKiT

0

這取決於您使用的是什麼Java ME configuration/profile。如果您使用的是CDC,請檢查是否支持Java SE 1.3 Collections框架的哪些部分(只需找到適用於您設備的javadoc並查看java.util包)。值得檢查的另一件事是你的設備是否有一些黑莓專用的API擴展來處理集合。

如果僅限於裸CLDC/MIDP的最小那麼比你提到的將字符添加到載體和使用Vector.contains(Object)

1

您可以使用net.rim.device.api.util.Arrays.getIndex(char[] array, char element)

相關問題