>

작은 자바 프로그램을 작성하고 있습니다 :

  • 텍스트를 문자열로받습니다
  • 2 개의 문자를받습니다

내가하려는 것은 "찾기 및 바꾸기"처럼 들리지만 같지 않으므로이를 지우는 것이 중요하다고 생각했습니다.

어쨌든이 텍스트를 가져 와서 첫 번째 배열의 문자가 텍스트의 문자와 일치하는지 확인하고, 그렇다면 두 번째 문자 배열의 일치하는 문자 (색인에 따라)로 바꿉니다.

예를 들어 설명하겠습니다 : 내 텍스트 (문자열)는 "java is awesome!"; "absm"과 "! @ * $"라는 두 개의 배열 (char [])이 있습니다.

원하는 결과는 'a'를 '!'로 바꾸는 것입니다. , 'b'~ '@'등 .. 결과 텍스트는 다음과 같습니다.

"자바는 대단하다!" ->"j @ v @ i * @ w * o $e!"로 변경되었습니다.

이 작업을 수행하는 가장 효율적인 방법과 이유는 무엇입니까? 텍스트를 반복하는 것에 대해 생각했지만 그렇게 효율적이지 않다는 것을 알았습니다.

(StringBuilder/문자열 클래스를 사용할 수 있습니다)

  • 답변 # 1

    StringBuilder sb = new StringBuilder(text);
        for(int i = 0; i<text.length(); i ++)
        {
            for (int j = 0; j < firstCharArray.length;j++)
            {
                if (sb.charAt(i) == firstCharArray[j])
                {
                    sb.setCharAt(i, secondCharArray[j]);
                    break;
                }
            }
        }
    
    

    이 방법은 StringBuilder를 사용하여 문자를 변경하기 때문에 효율적입니다 (문자열을 사용하는 경우 변경할 수 없기 때문에 매번 새 문자를 작성해야합니다). 또한 수행해야하는 패스의 양을 최소화합니다 ( 1은 텍스트 문자열을 통과하고 n은 첫 번째 배열을 통과합니다 .n = text.length ())

  • 답변 # 2

    적어도 참조로 StringUtils.replaceEach를 찾고 있다고 생각합니다.

  • 답변 # 3

    얼마나 효율적이어야합니까? 수백, 수천, 수백만 단어로이 작업을 수행하고 있습니까 ???

    가장 효율적인지 모르겠지만 문자열 indexOf() 를 사용할 수 있습니다  가능한 각 토큰에 대한 메소드를 사용하면 토큰이 있는지 알려주고 동시에 해당 인덱스를 다른 배열의 해당 문자로 바꿀 수 있습니다.

    코드 방식으로 (이것은 의사 코드의 절반입니다) :

    for(each of first array) {
        int temp = YourString.indexOf(current array field);
        if (temp >=0) {
            replace with other array
        }
    }
    
    

  • 답변 # 4

    지도에있는 2 개의 배열을 넣으십시오

    Map<Character, Character> //or Map of Strings
    
    

    키가 "a", "b"등이고 값은 "@"등으로 대체하려는 문자입니다.

    그런 다음 단순히 문자열의 키를 값으로 바꿉니다.

  • 답변 # 5

    이와 같은 작은 것들의 경우 indexOf () 검색이 맵보다 빠르지 만 허용되는 답변의 내부 루프를 "피할"수 있습니다. 물론 루프는 String.indexOf () 안에 여전히 존재하지만 JIT 컴파일러가 많이 사용하기 때문에 요금에 맞게 최적화 될 수 있습니다.

    static String replaceChars(String source, String from, String to)
    {
        StringBuilder dest = new StringBuilder(source);
        for ( int i = 0; i < source.length(); i++ )
        {
            int foundAt = from.indexOf(source.charAt(i));
            if ( foundAt >= 0 )
                dest.setCharAt(i,to.charAt(foundAt));
        }
        return dest.toString();
    }
    
    

    업데이트 : Oracle/Sun JIT는 indexOf ()에 대해 적어도 일부 프로세서에서 SIMD를 사용하므로 예상보다 훨씬 빠릅니다.

관련 자료

  • 이전 php - pdo - : fetch_props_late 및 __construct () 호출을 사용하는 pdo?
  • 다음 python multiprocessing matplotlib savefig () 문제를 해결하는 방법?