如何在Java中返回字符串中字符的索引数组

时间:2012-04-27 22:21:37

标签: java

我需要编写一个方法来返回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;
}

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分: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数组。

答案 2 :(得分:0)

代码看起来不太好。

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

尝试使用方法。

charAt(int pos)表示string和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);
    }
}