2012-04-27 10 views
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; 
} 
+0

실제로는 indexOf()가 위치를 반환하고 사용하고 있습니다. –

+4

http://codereview.stackexchange.com/에 대한 좋은 질문 같습니다. –

답변

1

당신은 그 toArray() method에 대한 호출을 배열에 복사합니다 끝 부분에 코드를 대체 할 수 있습니다. 그 외에는 꽤 괜찮아 보입니다.

+0

-1에 대한 이유가있을 수 있습니까? –

+0

예, 코드가 잘 보이지 않습니다. 게으른 것처럼 보입니다. –

+0

그것은 -1이라는 꽤 진절머리 나는 이유입니다. 아래 표는 부정확 한 정보를 나타내는 것이며 의견 차이를 표시하지 않습니다. –

0

코드가 좋지 않습니다.

루프 대신 하나의 루프를 사용합니다.

방법을 사용해보십시오.

문자열 수 charAt (INT의 POS) 및 Arrays.copy

영업 더 읽을 마땅한; P

첫번째 방법의 이러한 일부의 util 클래스에 넣고 정적되어야 위치 IMHO. 대신

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); 
    } 
} 
+0

어떻게 두 개의 루프가 이렇게됩니까? 문자열에 대해서만 하나의 반복 만 볼 수 있습니다. –

+0

@ QiangLi, indexOf에 다른 루프가 있고 additioanl을 호출하면이 용도로 사용하기에 적합하지 않은 메서드가 호출됩니다. 당신이 자세를 취하고 전체 코드를 작성하고 싶지 않을 때 사용해야합니다. –

+0

나는 이것이 더 빠른 방법이라고 생각한다. 네이티브 메소드이기 때문에'System.arrayCopy'가 더 빨라지는지 모르겠습니다. –

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 배열을 할당하기 때문에 나는 일반적인 경우에 더 효율적으로 고려하지 않을 것이다.

+0

하지만 전체 반복 길이는 동일합니다. 물론 두 경우 모두 자바 문자열이 무작위로 액세스 할 수있는 시퀀스 컨테이너라고 가정 할 수 있다면 좋습니다. –

+0

박싱 된 권투에 대해 잊지 마세요. –

+0

맞아, 내 원래의 솔루션은 여전히 ​​한 번 문자열을 반복! 그것이 "더"(얼마나 작은) 상관없이 효율적으로 권투/unboxing 부분을 제거하는 것입니다 만들 수있는 유일한 장소, 맞습니까? –

관련 문제