2009-05-19 7 views
7

Java의 [String.substring() 메서드] (http://java.sun.com/j2se/1.5.0/docs/api/java/lang/String.html#substring(int,%20int%29)이 그 방법으로 지정되어있는 이유를 모르겠다. 번호가 매겨진 위치에서 시작하여 지정된 수의 문자를 반환한다고 말할 수 없으며, 끝 위치를 직접 지정하고 String의 끝을 넘어서 끝 위치를 지정하면 나머지 문자열을 반환하는 대신 Java에서 예외가 throw됩니다.substring()은 어떻게 작동합니까?

여기서 substring() (또는 substr())에는 시작 위치와 길이의 두 매개 변수가 사용됩니다. 자바가 수행하는 방식보다 객관적으로 더 나은가요? 그렇다면 그것을 증명할 수 있습니까? substring()에 대한 최상의 언어 사양은 무엇입니까? 자바가 좋은 디자인 아이디어를 던지게하는 IndexOutOfBoundsException인가, 그렇지 않다면 Doe는 좋은 생각인가? 이 모든 것이 단지 개인적 취향에 달려 있습니까?

+2

그것은 참으로이 만드는 것입니다 개인적인 취향의 문제입니다 "주관적이고 arguementative". 서로 다른 시간에 하위 문자열의 "길이"와 "끝 위치"두 가지 맛이 필요합니다. 그래서 나에게 하나가 다른 것보다 "더 낫다"고 말하는 것은 이치에 맞지 않습니다. –

+2

주관적 일 뿐이므로 단순히 그것에 대해 언급 할 필요가 없습니다. 쳇. 거룩한 전쟁을하지 않고도 언어 결정의 상대적인 장점에 관해서 이야기 할 수는 없습니까? Jon Skeet이 대답할만한 가치가 있다고 생각하고 논쟁의 여지가 없다면, 분명히 의미가있을 것입니다. – skiphoppy

+1

"놀라는"단어와 "불편한 단어"를 꺼내기 위해 그것을 편집하면 아무도 실제로 논 했으므로 덜 논쟁적인 것처럼 보일까요? 스택 오버플로에 적합하지 않은 언어 디자인 질문 (본질적으로 대부분의 경우 주관적인 트레이드 오프가 포함됩니다)입니까? – skiphoppy

답변

1

leave off the 2nd parameter을 계산할 필요없이 문자열 끝에 도달하게됩니다. , 시작 위치 :

+0

때로는 x부터 20 자까지 또는 문자열의 끝 중 빠른 것을 원합니다. – Yishai

+1

가끔 x에서 문자열의 나머지 부분까지 숫자를 제외하고 싶습니다. 가능한 모든 요구 사항을 충족 할 수있는 API는 없습니다. –

+1

API는 모든 가능한 요구 사항을 충족시킬 수는 없지만 일부 API는 다른 API보다 많은 요구 사항을 분명히 충족시킬 수 있다고 생각합니다. 나는 아직도 그것에 염려하고, ​​응답을보고있다. :) 마지막 문장에 – skiphoppy

3

초 매개 변수는 첫 번째 매개 변수가 음의 값을 받아 들여야한다 ..

5

내가 문자열이() (또는 SUBSTR가())이 개 매개 변수를 언어로 사용하고있어 선택해야한다 길이는 입니다. 이 객관적으로 더 나은 Java가하는 방법보다, 그렇다면, 당신이 그것을 증명할 수 있습니까?

아니요, 객관적으로 좋지 않습니다. 그것은 모두 당신이 그것을 사용하고자하는 상황에 달려 있습니다. 특정 길이의 부분 문자열을 추출하려면 좋지 않지만 "."이 처음 나오는 부분 문자열을 추출하려는 경우 문자열에서 첫 번째 길이를 계산해야하는 경우보다 좋습니다. 문제는 어떤 요구 사항이 더 일반적인가하는 것입니다. 나는 후자를 말할 것이다. 물론 가장 좋은 해결책은 API에 두 가지 버전을 모두 포함하는 것입니다. 그러나 길이 기반 API를 항상 필요로하는 경우 정적 유틸리티 방법을 사용하는 것은 그렇게 끔찍한 일이 아닙니다.

예외적으로, 예, 확실히 좋은 디자인입니다. 당신은 특정 것을 요청했고, 특정 일을 얻을 수 없을 때, API는 당신이 대신 원하는 것을 추측해서는 안됩니다. 그렇게하면 버그가 더 빨리 드러납니다.

또한 Java DOES에는 시작 인덱스에서 문자열 끝까지 하위 문자열을 반환하는 alternative substring() 메서드가 있습니다.

9

길이가되는 두 번째 매개 변수가 더 편리 할 때가 있으며 두 번째 매개 변수가 "before to stop before"인 것이 더 편리 할 때가 있습니다. 마찬가지로 "너무 커서 큰 것을 줄 경우 문자열의 끝으로 가라"는 것이 편리하고 버그를 표시하고 실제로 예외를 throw해야하는 경우가 있습니다.

길이라는 두 번째 매개 변수는 고정 길이 필드가있는 경우 유용합니다.예를 들면 : 당신이 올라가고하는 경우

// C# 
String guid = fullString.Substring(offset, 36); 

오프셋되고 두 번째 매개 변수는 유용하다 또 다른 구분 :

// Java 
int nextColon = fullString.indexOf(':', start); 
if (start == -1) 
{ 
    // Handle error 
} 
else 
{ 
    String value = fullString.substring(start, nextColon); 
} 

일반적으로 사용하려는 하나의 것과 반대입니다 내 경험에 현재 플랫폼에서 제공 :

+4

+1. :) – jmucchiello

+0

+1, 같은 이유로. –

+0

+1. 같은 이유. –

1

두 번째 매개 변수로 인덱스 시나리오 유용하지만, 지금까지 그 시나리오의 모든 다른 언어/API 제한 사항. 예를 들어 API는 입력 문자열의 첫 번째 콜론 앞뒤에 문자열을 제공하는 편리한 루틴을 제공하지 않으므로 대신 String 색인을 가져오고 substring()을 호출합니다. (그리고 이것은 substr()의 두 번째 위치 매개 변수가 원하는 인덱스보다 1만큼 큰 값을 초과하는 이유를 설명합니다.

언어 툴킷에서보다 포괄적 인 문자열 처리 기능 세트를 사용하면, index-as-index 시나리오는 두 번째 매개 변수 길이만큼 손실됩니다. 하지만 누군가 내게 반례를 올려주세요. :)

+0

"예를 들어, API는 입력 문자열의 첫 번째 콜론 앞뒤에 String을 제공하는 편리한 루틴을 제공하지 않으므로 대신 String 인덱스를 가져 와서 substring()을 호출합니다." - API가 모든 것을 처리하기를 원한다면 막대한 API를 배우고 Stack Overflow는 30 초를 쓰는 대신 String 객체에서 30000 메서드 중 하나를 사용하지 않은 이유를 묻는 질문으로 구성됩니다. 그것이 우리가 프로그래머 인 이유입니다. 모든 것이 아직 작성되지 않았기 때문입니다. 작업 X를 많이해야하는 경우 자체 라이브러리를 작성하여 작업하십시오. –

+0

세계에서 왜 모든 사람이 하나의 구현을 가질 수있을 때 자신 만의 라이브러리를 쓰고 싶다면, 모든 펜스 포스트 오류를 ​​디버그 할 수 있습니까? – skiphoppy

0

이 멀리 저장하는 경우 문제가 당신의 꿈을 괴롭히는 중지해야하고 마지막으로 편안한 잠자리를 얻을 수 있습니다 :

public String skipsSubstring(String s, int index, int length) { 
    return s.subString(index, index+length); 
} 
+0

그건 단순히 IndexOutOfBoundsException을 날려 버릴뿐입니다. :) substring()에 두 번째 매개 변수를 min (index + length, s.length())로 지정하는 체크를 추가해야합니다. – skiphoppy

+0

String의 구현을 살펴보면, Java가 두 가지 패러다임을 제공하는 것이 그리 어렵지 않은 것처럼 보입니다. substring()은 그대로 유지되고 substr()은 다른 언어에서보다 일반적인 의미를 따를 수 있습니다. 내부적으로 구현은 간단 할 것 같습니다. – skiphoppy

+1

나는 다른 의미론을 가지고 substring()과 substr()을 모두 갖는 것이 끔찍하다고 생각한다.나는 내가 반 시간 이상 틀린 것을 사용할 것이라고 거의 확신 할 수있다. 그리고 나는 동료 프로그래머들 대부분도 그렇게 생각한다. –

관련 문제