2014-03-14 6 views
0

긴 문자열에서 문자로 시작하는 모든 단어를 얻으려고합니다. 어떻게 할거야, 자바 야? 모든 편지 나 비효율적 인 내용을 반복하고 싶지 않습니다.자바 문자로 시작하는 모든 단어 찾기

편집 : 나는 또한 cs 클래스에 대한 내장 된 데이터 구조 (물론 배열 제외)를 사용할 수 없습니다. 그러나 나는 자신의 데이터 구조를 만들 수있다 (나는 sevral을 만들었다). 단지

map.get("a") 
+0

을 당신이 알고하지 않기 때문에이 (피할 수없는 문자열의 모든 문자를보고 어떤 위로의 경우 *는 선험적 * 공간이있는 곳). – NPE

+1

솔루션/시도 (코드)를보고 나중에 효율성에 대해 걱정할 수 있습니다. 또한 "long"을 정의하십시오. – reto

+0

난이 도움이 될 생각 : 1. 분할 http://stackoverflow.com/questions/3481828/how-to-split-a-string-in-java 2. 그런 다음 "문자" 확인 http://stackoverflow.com/questions/4450045/difference-between-matches-and-find-in-java-regex – Bjego

답변

0

당신은 HashMap을 만들 수 네가 찾고있는 것을 할 것이다. if 문 옆에 단어로 원하는 것을 수행하십시오.

+2

데이터 구조에 대한 세부 사항은 제쳐두고, 시작 문자를 미리 알면 단어를 저장해야하는 이유는 무엇입니까? – NPE

+0

을 사용하면 런타임에 단어를 가져올 수 있습니까? –

+0

물론 문자열을 저장할 필요가 없으며, 입력에 의존합니다. 배열 인 경우 해시 맵에 값으로 배열에 인덱스를 저장할 수 있습니다. –

0
Scanner scan = new Scanner(text); // text being the string you are looking in 
char test = 'x'; //whatever letter you are looking for 
while(scan.hasNext()){ 
    String wordFound = scan.next(); 
    if(wordFound.charAt(0)==test){ 
     //do something with the wordFound 
    } 
} 

이렇게, "A"로 시작하는 모든 단어를 찾을

ant, bat, art, cat 

Hashmap 
a -> ant,art 
b -> bat 
c -> cat 

-

HashMap<String,String> map = new HashMap<String,String>(); 

예 -

0

split() 메소드를 사용할 수 있습니다. 다음은 예입니다.

String string = "your string"; 
String[] parts = string.split(" C"); 

for(int i=0; i<parts.length; i++) { 
    String[] word = parts[i].split(" "); 

    if(i > 0) { 
      // ignore the rest words because don't starting with C 
     System.out.println("C" + word[0]); 
    } 
else { // Check 1st excplicitly 
      for(int j=0; j<word.length; j++) { 

     if (word[j].startsWith("c") || word[j].startsWith("C")) 
       System.out.println(word[j]); 
      } 
     } 

    } 

"C"는 사용자 문자입니다. 그냥 배열 주위에 루프. 부품 [0]의 경우 "C"로 시작하는지 확인해야합니다. i = 1에서 루핑을 시작하는 것은 저의 실수였습니다. 올바른 당신은 그것을 통해 반복 다음 문자열에서 배열 수집을 취득하고 시도 할 수 0

+1

은 그 것처럼 보입니다. 덕분에 –

+1

이것은 너무 미묘하거나 완전히 잘못되었습니다. (나는 후자를 의심한다.) 만일 이것이 전자라면, 확장하라. – NPE

+0

기다려주십시오. –

2

에서입니다 :

String s = "my very long string to test"; 

for(String st : s.split(" ")){ 
    if(st.startsWith("t")){ 
     System.out.println(st); 
    } 
} 
0

당신은 문자열의 첫 글자를 얻고 API 방법으로 확인할 수있는 경우 그것이 편지인지 아닌지.

jkk isLetter 
ds isLetter 
32 not Letter 
+0

@reto all right .. 편집을하겠습니다. – guptakvgaurav

0

정규 표현식 방법 : 당신은 몇 가지를 명확히 할 필요가

public static void main(String[] args) { 
    String text = "my very long string to test"; 
    Matcher m = Pattern.compile("(^|\\W)(\\w*)").matcher(text); 
    while (m.find()) { 
     System.out.println("Found: "+m.group(2)); 
    } 
} 
2

다음

String input = "jkk ds 32"; 
String[] array = input.split(" "); 
for (String word : array) { 
    char[] arr = word.toCharArray(); 
    char c = arr[0]; 
    if (Character.isLetter(c)) { 
     System.out.println(word + "\t isLetter"); 
    } else { 
     System.out.println(word + "\t not Letter"); 
    } 
} 

일부 샘플 출력됩니다. "단어"란 무엇입니까? 당신은 편지로 시작하는 "단어"만을 찾고 싶기 때문에 단어가 다른 문자를 가질 수 있다고 가정합니다. 그러나 어떤 문자가 허용됩니까? 그런 단어의 시작을 정의하는 것은 무엇입니까? 공백, 비 문자, 비 문자/비 숫자, ...?

예 :

String TestInput = "test séntènce îwhere I'm want,to üfind 1words starting $with le11ers."; 
String regex = "(?<=^|\\s)\\pL\\w*"; 

Pattern p = Pattern.compile(regex, Pattern.UNICODE_CHARACTER_CLASS); 

Matcher matcher = p.matcher(TestInput); 
while (matcher.find()) { 
    System.out.println(matcher.group()); 
} 

때문에 수정의 0 개 이상의 "word" characters (유니 코드 문자와 숫자, 다음 (\pL 문자에 대한 Unicode property이다) 문자로 시작 (?<=^|\s)\pL\w*이 시퀀스를 찾을 수 정규식, Pattern.UNICODE_CHARACTER_CLASS).
lookbehind assertion(?<=^|\s)은 시퀀스 앞에 문자열 또는 공백 문자가 시작되도록합니다.

그래서 내 코드가 인쇄됩니다 :

test 
séntènce ==> contains non ASCII letters 
îwhere ==> starts with a non ASCII letter 
I  ==> 'm is missing, because `'` is not in `\w` 
want 
üfind ==> starts with a non ASCII letter 
starting 
le11ers ==> contains digits 

누락 된 단어 :

,to  ==> starting with a "," 
1words ==> starting with a digit 
$with ==> starting with a "$" 
관련 문제