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