2014-09-06 1 views
1

나는 방법 스트립 (가) 및 그 사용의 맥락이다찾기 여기에 "반대"또는 종료 문자

public String strip(String data, String tag) 
{ 
    ... 
} 
@param data a string where all open symbols such as [({ have a matching close somewhere after them. 
@param tag an opening symbol(such as "["  
@return a substring of the contents between the first given opening and the last corresponding closing character- with both characters removed. 
example: 

strip("caca blah blah [ hb {} ((stuff){okay} vv]","[") 

should return "hb {}((stuff)(okay) vv" 

내 질문 - 나는 마음에 솔루션을하지만 난 방법을 찾기 위해 노력하고있다 가능한 모든 조합을 직접 코딩하지 않고 주어진 "반대"또는 닫는 문자를 찾으십시오. 어떤 종류의 속임수 또는 패턴 문자 코딩, 또는 어쩌면이 유틸리티 어딘가에 이렇게 있습니까?

HashMap<String, String> closingChar = new HashMap<>(); 
closingChar.put(")", "("); 
closingChar.put("(", ")"); 
closingChar.put("}", "{"); 
closingChar.put("{", "}"); 

는 그런 다음 해당 문자를 찾을 수있는지도의 모든 문자를 조회 :

+2

"첫 번째 주어진 시작과 마지막 해당 닫는 문자 사이"는 정말 원하는 것입니까? 'a [b] [c] d'는'b '[c']를 줄 것입니다. – Henry

+0

저는 그 방법 자체에 관심이 없어요. 그 임의적인데, 지적 해 주셔서 고맙습니다. –

답변

2

"반대"문자를 수동으로 정의하면 매우 많지 않습니다. 이것은 Map, paired sequence, interleaved sequences, switch statement 등으로 할 수 있습니다. 모든 것은 좋은 깔끔한 방법 뒤에 숨겨 질 수 있습니다.


는이 (정말, 단지지도/스위치 사용) 가드를 갖춘이 "재미"접근 방식, 일하는 것이 권장하지 내가 할 동안 :

char closingOf(char c) { 
    String opens = "(<[{"; 
    if (opens.indexOf(c) > -1) { 
     // For "why" this works, see an ASCII character table. YMMV when 
     // including other Unicode symbols. 
     return c + (c < '<' ? 1 : 2); 
    } else { 
     return 0; // you get nothing 
    } 
} 

이 또한 할 수있다 인터리브 순서

String opens = "(<[{"; 
String closes = ")>]}"; 
int i = opens.indexOf(c); 
return i > -1 ? closes.charAt(i) : 0; 

또는과 :

쌍 순서로 수행

또는 부분적으로 스캔 된 순서에

String pairs = "()<>[]{}"; 
int i = pairs.indexOf(c); 
return i > -1 && (i % 2) == 1 ? pairs.charAt(i + 1) : 0; 
: 느낌

String pairs = ")>]}(<[{"; 
int i = pairs.indexOf(c, 4); 
return i > -1 ? pairs.charAt(i - 4) : 0; 

또는 경우 실제-하지만, 보링 (이 방법이 경우에 대한지도에 대한 좋은 경쟁자 내가 아마 그것을 사용합니다; 스위치는 이전의 "재미있는"예와 달리 쉽게 이해할 수 있습니다).

switch (c) { 
    case '(': return ')'; 
    case '<': return '>'; 
    case '{': return '}'; 
    case '[': return ']'; 
    default: return 0; 
} 
1

당신은 작은지도 같은 것을 사용할 수 있습니다. 위의지도는 첫 번째와 마지막 세 번째 행을 필요로하는 경우 첫 번째와 두 번째 행을 모두 닫는 문자를 제공합니다.