문제

나는 재미를 위해 그리고 단지 무언가를 프로그래밍하기 위해 미친 libs 프로그램을 작성하고 있습니다.프로그램 자체는 매우 간단하지만 사용자가 지정한 단어를 문장에 배치하는 게임의 특성상 여러 연결 방식을 사용하게 됩니다.더 적은 연결을 사용하거나 더 효율적인 작업을 위해 연결을 제거할 수 있는 우아한 해결 방법이 있습니까?연결을 사용하든 안하든 결국에는 아무런 차이가 없다는 것을 알고 있지만, 이 프로그램을 작성하는 더 우아한 방법이 있는지 궁금합니다.

업데이트:저는 Java를 사용하고 있지만 연결을 이스케이프 처리하는 일반적인 솔루션이 있다면 그것도 감사하겠습니다.

도움이 되었습니까?

해결책

한 가지 해결책은 전체 Mad Libs 파일을 작성하고 선택한 단어로 대체 해야하는 특수 토큰을 넣는 것입니다.

방금 새로운 $ {noun1}을 구입했는데 $ {verb1}로갑니다.

그런 다음 예를 들어 사용할 수 있습니다. String.replace("${NOUN1}", noun1) 모든 단어에 대해.

다른 팁

어떤 언어를 사용하고 있습니까?

대부분의 높은 수준의 langauges는 다음과 비슷한 것을 갖습니다.

String.Format("{0} {1} {2} {3}", word1, word2, word3, word4);

게임에서 연결을 피하는 것을 완전히 볼 수있는 두 가지 방법이 있습니다.

  1. 스토리 템플릿을 토큰 모음으로 보관하십시오 : 불변의 부품 및 단어 자리 표시 자. 그런 다음 단어 자리 표시 자 대신 불변 부품과 사용자 단어를 출력하는 컬렉션을 통해 루프하십시오.

  2. 단어 자리 표시 자 대신 charat 및 출력 단어를 사용하여 템플릿 문자열을 통해 루프하는 사용자 정의 인쇄 클래스를 작성하십시오.

문자열을 호출하는 대신 각 단어에 대해 게시하거나 StringBuilder에 끊임없이 추가하는 대신 단어를 주문한 배열에 넣고 String.format (JDK 1.5 또는 Newer) 또는 MessageFormat.format를 JDK 1.4로 사용할 수 있습니다. 불행히도 둘의 패턴 형식은 다릅니다.

String myPattern = "My %s eats your %s";
// get values from the user here
String result = String.format( myPattern, (Object[])myArray );

또는

String myPattern = "My {0} eats your {1}";
// get values from the user here
String result = MessageFormat.format( myPattern, (Object[])myArray );

다음은 명령 줄의 값으로 문자열을 채우는 완전한 프로그램입니다.

public class Format
{
    public static void main( String[] args )
    {
        String pattern = "My %s eats your %s";
        System.out.println( String.format( pattern, (Object[])args ));
    }
}

질문에는 두 가지 측면이 있습니다.

먼저, 코드에서 직접 연결을 사용하지 않으려 고 할 수 있습니다. 그런 다음 런타임에서 일부 문자열 형식 루틴을 사용할 수 있습니다. 이것은 연결을 건너 뛰지 않지만 코드에서 런타임으로 이동합니다.

둘째, 당신은 더 효과적으로 연결을하고 싶을 수도 있습니다. 그것은 또 다른 이야기입니다. 여기서 가장 중요한 것은 메모리 재 할당이 상당히 비싸기 때문에 연결된 문자열에 대한 큰 버퍼를 prealloge하는 것입니다. 결과 문자열에 하위 문자열을 복사하는 것은 일반적으로 저렴하고 필요한 악입니다.

동의를 피하는 일반적인 방법의 관점에서 내 마음에 아무것도 오지 않습니다. 당신이 할 수있는 일은 당신을 위해 연결의 일을 단순화하는 일종의 도우미 수업을 작성하는 것입니다. 그러나 내가 당신에게주고 싶은 제안은 문자열을 직접 연결하지 않는 것입니다.

String x = "Hi";
String y = x + " there!";

Java에서 문자열 연결 구현은 상당히 느리기 때문에 StringBuffer를 대신 사용하는 것이 더 나은 관행입니다.

StringBuffer myStringBuffer = new StringBuffer();
myStringBuffer.append("Hi");
myStringBuffer.append(" there!");

이 같은. 나는 지금 이것을 컴파일러에서 확인하지 않았지만, 당신이 그것을 직접 알아낼 수 있다고 확신합니다.

Java에 대해서는 잘 모르겠지만 PHP 및 Javascript와 같은 다른 언어에서는 배열을 만들고 모든 요소를 ​​결합하는 것이 더 빠를 수 있습니다.

자바스크립트 예:

var str = str1 + str2 + str3 + "str4" + str5 + "str6" + str7;
var str = [str1, str2, str3, "str4", str5, "str6", str7].join("");

PHP 예:

$str = $str1 . $str2 . $str3 . "str4" . $str5 . "str6" . $str7;
$str = implode("", array($str1, $str2, $str3, "str4", $str5, "str6", $str7));

이 방법은 각 문자열 사이에 구분 기호를 넣으려는 경우에 가장 적합합니다. 이 경우 더 빠를 뿐만 아니라 더 간결하고 읽기 쉽습니다.

'연결을 피함으로써'새 문자열의 공간을 할당하고 할당하는 것을 의미한다고 생각하십니까? .NET에 있다면 a StringBuilder 내가 생각하는 사람들을 도울 수 있어야합니다.

문자열이있는 경우 char [] 배열을 사용하고 끝을 수정할 때 문자열을 생성하면 트릭을 수행 할 수 있습니다.

원한다면 연결 없이 이 작업을 수행하는 것이 확실히 가능합니다.아마도 그다지 가치가 없을 수도 있습니다.

부분적으로는 결과를 표시할 위치에 따라 다릅니다.웹이나 콘솔에 있는 경우 결과를 출력 스트림에 직접 쓸 수 있습니다.

예를 들어, 템플릿이 "%001이 %002에서 뛰어내렸습니다"와 같은 경우 다음을 수행할 수 있습니다.

1) 문자열을 스캔하여 변수가 어디에 있는지 찾습니다.2) 문자열을 구성 요소 목록 "The", "The Jump Off",이 경우 3) 목록의 요소를 통과하고 결과를 덤프하고 다음과 같은 것으로 출력하도록 덤프하십시오.

PrintStream  = //get output from somewhere
for(int i = 0; i < pieces.size()-1 ; i++){
   ps.print(peices.get(i));
   ps.print(answers.get(i));
}
ps.print(pieces.get(pieces.size()-1));//last one

지금.당신이 그것을 '우아하다'고 부를지 아닐지 모르겠습니다.아마 좀 빠른 것 같습니다.내가 말했듯이, 이것이 웹 서비스이고 엄청난 인기를 끌었다면 아마도 적절할 것입니다.

GUI 앱인 경우 문자열을 별도로 그리는 코드를 작성할 수 있지만 연결하는 것보다 시간이 더 걸릴 수 있습니다.

하지만 한 가지 당신 ~할 수 있었다 do는 ByteArrayOutputStream을 사용하고 추가 할당 없이 채워진 madlib를 포함할 수 있도록 충분한 공간을 미리 할당하는 것입니다.그것도 꽤 빠를 텐데.

청결을 위해 일감을 잘 감상 해보고 놀랍게도 좋아 보일 수 있다면 동의를 피하고 싶은 이유는 무엇입니까? 단순히 (예 : "fdsfsd" +var1 +var2 +"dsfsdf" +"tyhty"그것은 스트링 빌더와 동일한 것을 컴파일합니다 (효과적으로 동일하고 더 깨끗해 보입니다). 문자열 빌더 루프 또는 복잡한 흐름으로.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top