在字符数组中找到一个特定的字符

问题描述:

我正在做一个应用程序,我想在字符数组中找到一个特定的字符。换句话说,我有以下的字符数组:在字符数组中找到一个特定的字符

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

您的优先事项是什么?你在寻找更快,还是更简单,还是......? –

一个选项是预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)'太慢或不适当?否则,这将是最好的选择 –

您可以使用散列/映射来检查字符的存在。根据散列/映射内部结构,此方法具有更好的O(log n)或O(1)时间。

如果你不想自己实现它,你可以使用的Apache Commons项目ArrayUtils:

ArrayUtils apache-commons

+1

忽略这个答案没有看到它是为黑莓ME。 –

如果您没有访问阵列,因为你是在工作的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

这取决于您使用的是什么Java ME configuration/profile。如果您使用的是CDC,请检查是否支持Java SE 1.3 Collections框架的哪些部分(只需找到适用于您设备的javadoc并查看java.util包)。值得检查的另一件事是你的设备是否有一些黑莓专用的API扩展来处理集合。

如果仅限于裸CLDC/MIDP的最小那么比你提到的将字符添加到载体和使用Vector.contains(Object)

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