Frage

Ich bin ein mad libs Programm für Spaß zu schreiben und nur Programm etwas. Das Programm selbst ist ziemlich geradlinig, aber ich finde mich aufgrund der Natur des Spiels zu mehreren Verkettungen zurückgreifen, wo man Benutzer angegebenen Wörter in einem Satz platzieren. Gibt es eine elegante Arbeit um auf weniger Verkettungen zu greifen oder sogar beseitigen sie für etwas effizienter? Ich weiß, am Ende wird es keinen Unterschied machen, wenn ich Verkettungen verwenden oder nicht, aber ich bin gespannt, ob es ein elegantere Weg ist, dieses Programm zu schreiben.

Update:. Ich bin mit Java, aber wenn es eine allgemeine Lösung Verkettung zu entkommen, die zu geschätzt würden

War es hilfreich?

Lösung

Eine Lösung könnte sein, Ihre ganze mad libs Datei zu schreiben und in speziellen Token setzen, die durch die Worte ersetzt werden müssen, die ausgewählt werden.

  

Sie kaufte ein brandneuen $ {NOUN1}   und es wird auf $ {} VERB1 Sie.

Dann können Sie verwenden, zB:. String.replace("${NOUN1}", noun1) für alle Wörter

Andere Tipps

Welche Sprache werden Sie mit?

Die meisten Hochsprachen etwas haben werden ähnlich wie:

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

Es gibt zwei Möglichkeiten, die ich sehen, können Sie ganz Verkettung in Ihrem Spiel zu vermeiden:

  1. Speichern Sie die Geschichte Vorlage als eine Sammlung von Tokens: unveränderliche Teile und Wort Platzhalter. Dann Schleife durch die Sammlung statt Wort Platzhalter unveränderliche Teile und Benutzer Worte ausgegeben werden.

  2. Schreiben von benutzerdefinierten Druck Klasse, die in einer Schleife durch die Vorlage Zeichenfolge mit charAt und Ausgangswörter anstelle von Wort Platzhalter.

Anstatt String.replace für jedes Wort Aufruf oder ständig an einen String anhängen, könnte man die Worte in einer geordneten Anordnung setzen und verwendet String.format (in JDK 1.5 oder höher) oder MessageFormat.format in JDK 1.4. Leider sind die Muster-Formate für die zwei verschiedene.

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

oder

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

Hier ist ein komplettes Programm, das mit den Werten aus der Befehlszeile in der Zeichenfolge füllt.

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

Es sind zwei Aspekte Ihrer Frage.

Als erstes möchten Sie vielleicht Verkettungen direkt im Code zu vermeiden, verwenden. Dann können Sie einige String-Formatierung Routine aus der Laufzeit verwenden. Dies wird nicht Verkettungen überspringen, sondern sie aus dem Code auf die Laufzeit bewegen.

Zweitens können Sie Verkettungen mehr efficently zu tun. Das ist eine andere Geschichte. Das Wichtigste hier ist es, die groß genug Puffer für die verkettete Zeichenfolge vorzubelegen, da Speicher Umverteilungen recht teuer sind. Kopieren Strings in die Ergebnisstrings sind in der Regel weniger teuer und sind ein notwendiges Übel.

Nichts kommt im Hinblick auf eine allgemeine Art und Weise meiner Meinung nach Verkettung zu vermeiden. Was Sie tun können, ist selbst eine Art von Hilfsklasse zu schreiben, die die Arbeit für Sie die Verkettung vereinfacht. Ein Vorschlag Ich mag würde Ihnen jedoch geben ist nicht direkt an Strings als

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

Die Umsetzung der String-Verkettung ist ziemlich langsam in Java, so ist es eine bessere Praxis String zu verwenden, anstatt, vor allem wenn man viel Verkettungen tun:

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

So etwas wie dies. Ich habe das nicht in einem Compiler überprüfen jetzt, aber ich bin sicher, dass Sie es herausfinden kann, sich selbst.

über Java nicht sicher, aber in einigen anderen Sprachen wie PHP und Javascript ein Array erstellen und alle Elemente verbinden können schneller sein.

Javascript Beispiel:

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

PHP Beispiel:

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

Diese Methode ist am besten, wenn Sie ein Trennzeichen zwischen den einzelnen String setzen wollen in diesem Fall ist es nicht nur schneller sein wird, aber kompakter und lesbar.

Mit dem ‚Vermeidung Verkettung‘ Ich nehme an, Sie meinen den Platz für den neuen String-Aufteilung und es zuweisen? Wenn Sie auf .NET sind dann ein String sollten einige helfen, denke ich.

Wenn Sie eine Zeichenfolge eine Notwendigkeit, es zu ändern, sehr oft, ein char [] Array und einen String zu schaffen, wenn Sie fertig zu modifizieren, es könnte den Trick tun.

Es ist sicherlich möglich, dies ohne Verkettung zu tun, wenn Sie wollen. Obwohl es wahrscheinlich nicht sehr lohnenswert.

Es hängt zum Teil davon ab, wo du gehst, um das Ergebnis anzuzeigen. Wenn es auf dem Netz oder die Konsole ist, dann können Sie das Ergebnis direkt zu einem Ausgabestrom schreiben.

So zum Beispiel, wenn Sie Ihre Vorlage etwas war wie „die% 001 aus dem% sprang 002“ Sie konnte:

1) scannen die Zeichenfolge zu finden, wo die Variablen. 2) brechen die Zeichenfolge in eine Liste der Komponenten „der“, „sprang aus dem“, in diesem Fall 3) eine Schleife durch die Elemente Ihrer Liste und die Ergebnisse und steckt sie zur Ausgabe mit so etwas wie folgt aus:

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

Jetzt. Ich weiß nicht, ob Sie das ‚elegant‘ oder nicht nennen. Es wäre wahrscheinlich schnell Art sein. Wie ich schon sagte, vielleicht sinnvoll, wenn es sich um eine Web-Service, und es wurde super beliebt, usw.

Wenn dies eine GUI-Anwendung ist, können Sie Code schreiben, um die Saiten separat zu ziehen, aber das würde wahrscheinlich mehr Zeit dann Verkettung nehmen.

und eine Sache, die Sie könnte zu tun ist, eine ByteArrayOutputStream verwenden und genügend Platz vorbelegt, so dass er das ausgefüllte madlib enthalten könnte zusätzliche Zuweisungen ohne zu machen. Das wäre auch ziemlich schnell sein.

Warum wollen Sie Verkettung zu vermeiden, wenn seine Sauberkeits versuchen es schön Schlange und es kann überraschend good.Even am Ende aussehen, wenn Sie sich Sorgen über die Leistung sind, können Sie nicht String-Builder verwenden müssen, glaube ich, dass, wenn Sie tun ein Bündel von Verkettungen einfach (dh „fdsfsd“ + var1 + var2 + „dsfsdf“ + „tyhty“ als String-Builder auf die gleiche Sache kompiliert (effektiv gleich und sieht sauberer). String Builder sinnvoll ist, wenn Sie concating ein Tonne Material in einer Schleife oder mit einem komplexen Strömungs.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top