0

我需要编写一个方法来返回Java字符串中字符的索引数组。下面的好(正确性、效率、尽可能短的代码)是否足够?

int[] charIndexArray(String s, char c) {
    int start = 0;
    List<Integer> list = new ArrayList<Integer>();
    while ((start = s.indexOf(c, start)) != -1) {
        list.add(start);
        start++;
    }
    int arr[] = new int[list.size()];
    for (int i = 0; i < ret.length; i++)
        arr[i] = list.get(i);
    return arr;
}
4

3 回答 3

1

代替:

while ((start = s.indexOf(c, start)) != -1) {
    list.add(start);
    start++;
}

考虑:

for (int i = 0; i < s.length(); i++) {
    if (s.charAt(i) == c) {
      list.add(i);
    }
 }

因为 indexOf 会导致创建一个完整的其他循环来搜索角色的下一个实例。

您的代码正在悄悄地做:

while (start != -1) {
    start = -1;
    for ( int i=start;i<s.length();i++){
      if ( charAt(i) == c ) {
        start = i;
        break;
      }
    }
    if ( start != -1 ) { 
    list.add(start);
    start++;
  }
}

这似乎不是更有效。但事实证明,在花费了太多时间之后:

static int[] charIndexArrayByBits(String s, char c) {
    int start = 0;
    int[] list = new int[s.length()];
    int count = -1;
    while ((start = s.indexOf(c, start)) != -1) {
      list[++count] = start;
      start++;
    }
    return Arrays.copyOf(list, count);
  }

是比较快的。但是在一般情况下,我不会认为它更有效,因为您分配的 int 数组在空间上会更大。

于 2012-04-27T22:42:18.397 回答
1

您可以通过调用toArray() 方法替换最后将其复制到数组的代码。除此之外,看起来还不错。

于 2012-04-27T22:25:40.157 回答
0

代码看起来不太好。

您使用两个循环而不是一个。

尝试使用方法。

charAt(int pos) 用于字符串和 Arrays.copy

OP 不应该阅读更多内容;p

首先是这种方法应该放在某个 util 类中的位置,并且是静态的恕我直言。

public class CharSequenceUtil {

    private static int[] EMPTY_INT_ARRAY = new int[0];

    /**
    * Method search the position of given character in char sequence.
    *
    * @param CharSequence seq - Sequence of char that will be investigate 
    * @param char c - Character that is analysed.
    *
    * @return int array with positions of char c in CharSequence instanace
    * @throws NullPointerException if seq is null.
    */
    public static int[] charIndexArray(CharSequence seq, char c) {

      if(seq == null) {
        throw new NullPointerExcetion("The seq must not be null");
      }

      if(seq.length() == 0) {
        return EMPTY_INT_ARRAY;
      }

      int[] positions = new int[seq.lenth()];
      int stor = -1; 

      for(int pos = 0; pos < seq.length(); seq++) {
         if(c == seq.charAt(pos)) {
          positions[++stor] = pos;
         }
      }

      if(stor == -1) {
        return EMPTY_INT_ARRAY;
      }

      return Arrays.copyOf(positions, stor);
    }
}
于 2012-04-27T22:28:40.127 回答