2013-03-29 2 views
3

나는 학생 취미 프로젝트의 일부로 API를 개발하고 있으며,받은 정보를 변경하기 위해 다양한 옵션을 추가/삭제할 수있는 URL을 사용하고 있습니다. 나는 문자열이 불변하다는 것을 알고 있습니다. 그래서 문자열을 깔끔하게 해결하기가 다소 어려워졌습니다. 나는 몇 가지 지저분한 방법을 생각해 냈습니다. 아무리 견고하고도 해결할 수있는 방법이 없었습니다. 표준 접근 방식이 있는지 궁금합니다. 나는 옵션을 "포함", "추가"및 "제외"할 수있는 라디오 버튼 (그룹에 할당되지 않고 모든 순열이 필요함)을 가질 계획입니다.자바 : 문자열을 변경하는 방법에도 불구하고 문자열을 "변경"하는 방법은 무엇입니까?

따라서 여기 YahooFinance API와 상호 작용하는 데 사용되는 z?s=GOOG&t=7m&z=l&q=l&p=e50,m50&a=ss,sfs,vm,w14 문자열이 있습니다.

이제
String options="z?s=GOOG&t=7m&z=l&q=l&p=e50,m50&a=ss,sfs,vm,w14" 

, p=e50,m50을 말한다 부분을 고려 : 그래서,이 같은 몇 가지 변수가 있다고 가정합니다. 내가 세 개의 라디오 버튼 50, 100, 200을 가지고 있다고 가정하고, 모든 버튼이있는 문자열 p=e50,m50,e100,m100,e200,m200을 비롯하여 가능한 모든 다른 조합을 켜고 켤 수 있습니다. 즉 100을 끄면 p=e50,m50,e200,m200처럼 보일 것입니다.

의견이 있으십니까? 궁극적으로 다른 값 (ss,sfs 등)을 사용하여 동일한 작업을 수행하고 싶습니다. 그러나 이동 평균으로 시작해 봅시다.

+0

단추의 켜기/끄기 표현을 위해 BitArray를 고려 했습니까? 필요한 순간에 최종 문자열을 구성 할 수 있습니까? –

+0

원하는 문자열을 작성하기 만하면됩니다. 짧은 문자열을 연결하거나 char 배열이나 StringBuilder 또는 형식화 프로그램을 사용하여 멋지게 만들 수 있습니다. 로켓 과학이 아닙니다. –

+0

(힌트 : String 클래스의 사양을 읽고 거기에서 사용할 수있는 기능을 확인하십시오. 원하는 경우 StringBuilder를 사용할 수 있습니다.) –

답변

2

변경 가능한 문자열을 사용하면 코드가 복잡해질뿐입니다. 필요한 것은 매개 변수를 쉽게 업데이트 할 수있는 데이터 구조입니다. 그런 다음 해당 데이터 구조를 트래버스하여 문자열을 만듭니다. 이 매개 변수를지도에 저장하고지도 항목을 반복하여지도에서 문자열을 만드는 함수를 작성합니다.

그래서 당신은 같은지도에 매개 변수를 저장하는 것 :

Map<String,String> map = new LinkedHashMap<>(); 
map.put("s", "GOOG"); 
map.put("t", "7m"); 

와 같은 뭔가 매개 변수 문자열을 생성합니다

public String createParameterString(Map<String, String> map) { 
    StringBuilder builder = new StringBuilder(""); 
    for (Map.Entry mapEntry : map.entrySet()) { 
     if (builder.length() != 0) builder.append("&"); 
     builder.append(mapEntry.key()); 
     builder.append("=") 
     builder.append(mapEntry.value()); 
    } 
    return builder.toString(); 
} 
8

사용하십시오 StringBuilderinsert 방법.

Java documentation page

+0

다른 모든 사람들이 올바른 접근 방식이 아니라고해도 그가 묻는 것 : –

+0

@BillK,'insert()'가 오프셋을 필요로하기 때문에 그렇게 생각하지 마라.이 대답은 어떻게 얻는 지 말하지 않는다. 또한, OP는 * 비트도 제거하도록 요청합니다. 따라서, 잘못된 질문에 대한 대답은 잘못된 것입니다 : P – Raffaele

+0

StringBuffer는 실제로는 변경 가능한 문자열이므로 더 정확할 것입니다. 그러나이 문자열은 충분히 가깝다고 생각했습니다. –

2

일반적으로, 당신은 부분으로 문자열을 중단하고, 새로운 문자열을 조립한다. 호출자는 이전 문자열과 새 문자열에 대한 참조를 유지하거나 이전 문자열을 버릴 수 있습니다. 바보 같은 예를 들어

:

String hairySally = "hairy,sally"; 
String hairyFredSally = insertFred(hairySally); 


String insertFred(String s) { 
    String[] parts = s.split(","); 
    return parts[0] + ",fred," + parts[1]; 
} 
6

문자열은이 JVM에서 생성 된 후에는 문자열의 특정 인스턴스의 내용을 변경할 수있는 방법이 없다는 의미에서 유일한 불변입니다. 즉, 필요에 맞게 즉석에서 문자열을 구성 할 수 없다는 의미는 아닙니다. 당신은

String options="z?s=GOOG&t=7m&z=l&q=l&p=" + eOption + ",m50&a=ss,sfs,vm,w14"; 

는 기술적으로,이 세 개의 문자열 인스턴스를 생성하고, StringBuffer를 함께 그들 모두를 추가하는 데 사용됩니다 ... 간단한 연결을 사용하고 같은 일을 할 수 있습니다. StringBuffer API를 직접 사용하고 옵션을 추가 할 위치에서 .append()를 호출 할 수 있습니다.당신이 찾고있는 무엇

1

는 예를 들어, formatted strings입니다 : e50,m50%s로 대체되었습니다

String querystringFormat="z?s=GOOG&t=7m&z=l&q=l&p=%s&a=ss,sfs,vm,w14" 

하는 것으로, 문자열의 일부를 나타내는 형식 문자열 코드는 다른 문자열로 대체됩니다.

그런 다음, 당신은 당신이 당신의 매개 변수를 구축 할, 그리고 무엇 이건 할 것 :이 형식 문자열을 사용하는 다른 옵션 및 세부 사항의 많은,하지만

String params = "e50,m50,e100,m100,e200,m200", 
Formatter formatter = new Formatter(); 
formatter.format(querystringFormat, params); 
String query = formatter.toString(); 

그 기본적인 생각이다. 좋은 부분은 문자열 구조의 불변 부분이 명확하고 교체해야하는 부분 만 교체한다는 것입니다.

또한 얼마나 나쁜 일 :

1

결코 C 및 C++의이 printf, 왜 의 mutate 문자열 하시겠습니까 사용하는 방법을 가르쳐주지? 왜 String 관점에서이 문제에 접근합니까? 이 질문은 텍스트가 아닙니다. 무엇

?s=GOOG&t=7m&z=l&q=l&p=e50,m50&a=ss,sfs,vm,w14 

이는 URI encoding scheme에와 HTTP 요청의 URL에 추가 따라 직렬화 즉, 키 - 값 쌍의 컬렉션 (또한 사전이라고도 함) 단지지도,의 대표 문자의 순서. 특히 URI가 문자의 작은 하위 집합 만 받아들이 기 때문에 직렬화 된 부분을 추적하고 싶지는 않습니다. 따라서 문자열을 이유로 생각하면 작동하지 않는 코드로 끝날 가능성이 큽니다.

Map을 URI 형식으로 직렬화하는 방법과 직렬화 된 형식에서 Map을 가져 오는 방법 중 하나가 필요합니다. 야후 프로토콜은 쉼표를 사용하여 동일한 키에 여러 값을 할당합니다. 직렬화 및 비 직렬화 할 때 이것을 고려해야합니다.

나는 a gist을 썼습니다. 철저한 테스트는 아니지만 아이디어를 얻습니다.

관련 문제