마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

특정 문자가 나올 때 까지 앞에 있는 문자들을 없앨려고 하는데요..에러가 발생 합니다... [closed]

0 추천
String dataRecieved = "";

while (!readMessage.substring(0, 3).equals("456")) {
       
  int i = 2;

  readMessage = readMessage.replace(
  readMessage.substring(0, i), "");
       
  readMessage.trim();

 } 
 dataRecieved = readMessage;
 tx.append("PID : " + dataRecieved.substring(0, 3) + ", data : "
   + dataRecieved.substring(3, 5));

예를 들어서 123456789 이러한 string이 있다면 456 이라는 string이 나올 때 까지 replace를 이용해서 지우고 456을 초기 문자로 만들려고 합니다. 그런데 456이라는 string이 나오면 에러가 발생합니다....while 구문을 사용해서 하는데...제가 잘 못 한것인지....

질문을 종료한 이유: 해결
안왕초보 (1,390 포인트) 님이 2014년 2월 25일 질문
안왕초보님이 2014년 3월 4일 closed

2개의 답변

+2 추천
 
채택된 답변

원하시는게 문자열이 123456789 일때 456이 들어있는문자면 456789 이렇게 나와야 된다는건가요?

String str = "123456789";
String indexStr = "456";
		
if (str.indexOf(indexStr) != -1) {
        System.out.println("result :"+str.substring(str.indexOf(indexStr), str.length()));
}

 

bangbang (8,820 포인트) 님이 2014년 2월 25일 답변
안왕초보님이 2014년 2월 25일 채택됨
넵 그렇게 나와야 하는 ㅎㅎ
오!!!! 감사합니다!!! 됩니다!!! indexOf 그냥 문자 하나로만 자르는 줄 알았는데!! 감사합니다 ㅜㅜ
bangbang님!!너의 구세주이십니다 ㅜㅜ 드디어 잠을 잘 수 있겠네요 ㅜㅜ
방방님 말씀처럼 하시면 될 것 같은데
String indexStr = "410C";
if (readMessage.indexOf(indexStr) != -1) {
  // 410C~
  dataRecieved = readMessage.substring(readMessage.indexOf(indexStr), readMessage.length()));
  // 필요하다면 410C를 한번더 잘라주는 작업을 추가
  dataRecieved = readMessage.substring(4, readMessage.length()));
}
else {
  dataRecieved = SoundRacerActivity.this.whSrting(readMessage);
}
그런데 요지는 어제 첫글자가 씹히는 문제 아니였나요!?
함수 쪽은 아이에 사용 안하였습니다. 그냥 indexStr만 사용을 하였는데 제대로 되더군요 ㅎㅎ
허 뭐지...아까 테스트 했을 때 된 것 같은데 else 문 씹히네요??
앞쪽에 (0,4)가 410C가 아니면 410C를 찾아서 이것을 기준으로 처음 부터 0을 시작 하는 것입니다. 그러니깐 12 34 56 41 0C 12 34 이렇게 되어있다고 보면 현재 410C의 위치가 (6,10) 이렇게 되어 있는 것을 41 앞에 있는 12 34 56을 날려버리고 41 0C 12 34 로 만드는 것이었습니다..그런데..41 0C가 (0,4)로 시작 하는 것을 하려는데 갑자기 이 부분 씹혀버립니다. else 해도 씹히고 else if 문으로 equals를 해도 씹혀버립니다. 아...이런 에러가 갑자기 생겨버리네요..
..41 0C가 (0,4)로 시작 하는 것을 하려는데 갑자기 이 부분 씹혀버립니다. else 해도 씹히고 else if 문으로 equals를 해도 씹혀버립니다

응? 이 현상에 대해 조금 더 자세히 알려주세요
씹힌다는게 어떤 상황인지 ㅎㅎ
방방님이 알려주신대로 문자열 파싱을 하셨다면
410C1234 를 얻으셨을테고
이 문자열에서 섭스(0,4)를 했는데 410C가 아닌 다른값이 들어온다는건가요?
아니요 아이에 값을 출력을 못합니다 readMessage에서 받은 값을 필터 없이 출력 하는 곳에서는 나타나고 substring을 이용해서 나타내는 곳에서는 값을 출력 못하고 있습니다. 뭔 상황이죠??
textview를 이용해서 받는 내용을 두가지로 구분 해서 출력을 하고 있습니다. 하나는 readMessage에서 substing 등 아무 필터 없이 받는 내용 그대로 출력 하는 textview 하나, 그리고 substing 등을 이용해서 필터 처리를 한 후 출력을 하는 textview 하나 이렇게 두개를 나타내고 있는데 필터 처리 없는 곳에서는 값이 나오는데 필터 처리 하는 곳에서는 처리를 못하고 있습니다.
그럼 필터부분의 소스를 보여주세요~
if (readMessage.indexOf(indexStr) != -1) {
                            readMessage = (String) readMessage.subSequence(
                                    readMessage.indexOf(indexStr),
                                    readMessage.length());
                        }
                        dataRecieved = readMessage;
차에 가서 테스트 하기 전에 다 되서 테스트 하러 갔는데 갑자기 이러내요 뭐지...
if (readMessage.indexOf(indexStr) != -1) {
                            if (!readMessage.startsWith(indexStr)) {
                                readMessage = readMessage.subSequence(
                                        readMessage.indexOf(indexStr),
                                        readMessage.length()).toString();;
                            }

                            dataRecieved = readMessage;
                        }

이렇게도 해보고

if (readMessage.indexOf(indexStr) != -1) {
                                                            readMessage = readMessage.subSequence(
                                        readMessage.indexOf(indexStr),
                                        readMessage.length()).toString();;
                           

                            dataRecieved = readMessage;
                        }
if (readMessage.startsWith(indexStr)) {
dataRecieved = readMessage;

}

이렇게도 해봤는데 안되네요...
음.. 로직은 이상없으니까 문제는 조건문이겠네요 ㅎㅎ
indexStr 값이 뭐에요? 410C 인가요?
조건문 들어가기 전에 readMessage 한번 찍어보세요
공백은 확실히 제거된거죠?
네 410C 입니다 일단 찍어 봐야 겠네요
아 조건문 들어가기 전에 찍어 주는거 따로 조건문 들어갔을 때 따로 두개 출력 하고 있습니다 ㅎㅎ 조건문 들어가기 전에 꺼는 제대로 나옵니다
+1 추천

안왕초보님 고생많으시네요 ㅠ

예를 들어서 123456789 를 대입하셨다면

int i = 2

readMessage = readMessage.replace(readMessage.substring(0, i), "");

라고 하셨으니..

1회 수행 : 12/3456789 -> 3456789

2회 수행 : 34/56789 -> 56789 인데

조건은 (!readMessage.substring(0, 3).equals("456"))

앞 3글자 456 조건이 부합하는 경우가 없지 않나요?

 

글구.. 너무 readMessage 를 그대로 사용하려고 애쓰시는 것 같음 ㅎㅎ

갠적으로는 함수를 만들어서 문자열 작업을 직접 하드코딩하시는 것이 더 확실할 것 같에요

초보개발자ㅠ (33,870 포인트) 님이 2014년 2월 25일 답변
오늘 까지라 ㅜㅜ 가르쳐 주는 사람이라도 있으면 좋은데 가르쳐 줄 사람이 없어서 밤샘 노가다 했습니다 ㅜㅜ

handleMessage(){
if (!readMessage.substring(0, 4).equals("410C")) {
                            dataRecieved = SoundRacerActivity.this
                                    .whSrting(readMessage);
                        } else if (readMessage.substring(0, 4).equals("410C")) {
                            dataRecieved = readMessage;
                        }

}

public String whSrting(String str) {

        while (!str.substring(0, 4).equals("410C")) {
            if (str.substring(0, 4).equals("410C"))
                break;
            int i = 2;

            str = str.replace(str.substring(0, i), "");

            str.trim();

        }
        return str;
    }

이렇게 함수를 해보았지만 오류가 뜨네요 ㅎㅎ 2시간 자고 또 작업 하니 뭐가 먼지도 모르겠습니다 이제는 ㅎㅎ 아그리고 써야 할 데이터들은 무조건 짝수로 들어와서 필요한 데이터 부분인지 아닌지를 알기 위해서
readMessage.contains("410C") 이것을 하였구요 ㅎㅎ 그냥 임의로 글을 적다보니 그렇게 되어버렸네요 ㅎㅎ 41 0C 이렇게 딱 데이터가 들어와서 ㅎㅎ 초보개발자님 매번 감사합니다 ㅜㅜ
하다 보니
if (!readMessage.substring(0, 4).equals("410C")) {
                            dataRecieved = SoundRacerActivity.this
                                    .whSrting(readMessage);
                        } else if (readMessage.substring(0, 4).equals("410C")) {
                            dataRecieved = readMessage;
                        }
이부분이 필요 한가라고 생각이 드네요 흠...일단 함수 쪽에서 걸려서 나오는 거니..흠...
초보개발자님 됩니다!!bangbang 님 께서 알려주신 방법으로 하니 됩니다 ㅎㅎ indexOf는 문자 하나로만 되는지 알고 적용을 안해봤는데 아...이제 다 끝낼수 있겠습니다 ㅜㅜ 많은 답변 감사합니다 ㅜㅜ
왕!! 고생 많으셨어요~ 데드라인 맞추신건가?!
후딱 끝내고 쉬세요 +_+
...