2017-06-13 3 views
0
private String createURI (String URL , String... parameters) { 
     if (parameters != null && parameters.length > 0) { 
      return String.format(URL, "5435534", "John" , parameters[0].toString()); 
     } 

     return String.format(URL, "5435534", "John"); 
    } 

Ich erstellte eine Methode, die URL oder URL + zusätzliche Parameter erhalten und erstellen Sie von ihnen eine URL durch die übergeben Werte. Natürlich sollte die Menge von% s in der URL der Anzahl der Parameter entsprechen.Receiving String ... Parameter und übergibt seine Werte an andere Methode, die String ... Parameter

Ich benutze es wie folgt aus:

createURI ("%s/call/%s") ==> 5.435.534/Anruf/John

createURI ("%s/call/%s/%s" , "familyName") ==> 5.435.534/Anruf/John/family

ich etwas geschaffen, wie diese wollte nicht : String createURI (String URL , String parameter) und übergeben Sie einfach leere Zeichenfolge, wenn ich es nicht verwenden möchte und dann in der Methode einchecken, ob der Text leer ist oder nicht, und rufen Sie die Methode den nächsten Weg:

createURI ("%s/call/%s" , "") 
createURI ("%s/call/%s/%s" , "FamilyName") 

meine Frage ist, wie kann ich es verbessern, indem Sie genau die Argumente an die String.format-Methode geschickt senden, ohne das [0] -Element explizit zu senden - ich möchte die Werte nicht überprüfen, die String.format tut es aber schon Zeichenfolgewerte Wenn ich die Parameter nur so übergebe wie (Typ String ...) an String.format(URL, "5435534", parameters), erhält sie nicht den tatsächlichen Stringwert, sondern das vollständige Objekt.

+0

Nicht ganz sicher, was Sie versuchen, aber haben Sie versucht, einen Blick auf die Zeichenfolge api https://docs.oracle.com/javase/8/docs/api/java/lang/String.html? –

+0

Ich glaube nicht, dass Sie die Methode 'String.format' in der von Ihnen gewünschten Weise verwenden können. Wahrscheinlich müssen Sie die Verkettung stattdessen mit einer Schleife kombinieren. –

+0

Randnotiz: Wenn 'Parameter' ein Array von' String' ist, hat die Verwendung von 'toString()' auf 'Parameter [0]' keinen Sinn. 'Parameter [0]' sind genau die gleichen wie 'Parameter [0] .toString()'. – ajb

Antwort

1
private String createURI (String URL , String... parameters) { 
     ArrayList<String> strs = new ArrayList<>(); 
     strs.add("5435534"); 
     strs.add("John"); 
     strs.addAll(Arrays.asList(parameters); 
     return String.format(URL, strs.toArray()); 
} 

Sie können beitreten alle Parameter auf Liste und wandelt es in Array für String.format. Auf diese Weise wird kein wenn dafür. und müssen anrufen: varargs Standardgröße ist .

+0

Das ist ein bisschen schwierig. Es hängt von der Tatsache ab, dass 'toArray()' ohne Parameter definiert ist, um 'Object []' zurückzugeben. Siehe [das Javadoc] (http://docs.oracle.com/javase/8/docs/api/java/util/List.html#toArray--). Der Code _looks_ sollte "String []" zurückgeben, was nicht funktionieren würde, weil 'format' definiert ist, ein' Object [] 'zu nehmen. Ich würde Code ohne einen erklärenden Kommentar nicht verwenden. – ajb

+0

@ajb funktioniert gut! – RonTr

0

String.format() (ohne Locale Parameter) nimmt zwei Argumente: eine Format-String, und eine Reihe von Object:

public static String format(String format, 
          Object... args) 

Da das zweite Argument ... Schreibweise verwendet, haben Sie zwei Möglichkeiten, um das zweite Argument übergeben: Entweder können Sie ihm eine Object[] übergeben, oder Sie können ihm keine oder mehrere Argumente irgendeines Typs übergeben, die dann in eine Object[] gebündelt werden. Das sind die einzigen zwei Möglichkeiten. Sie können beispielsweise zwei Argumente nicht übergeben und dann ein Array übergeben, das die Methode als drittes, viertes usw. Argument sieht. Dieses Array wird als ein einzelnes Argument angesehen.

Allerdings können Sie Ihre eigene Object[] Array erstellen, stellen Sie die ersten beiden Elemente des Arrays, und kopieren Sie den Rest in, so etwas wie:

Object[] formatParameters = new Object[parameters.length + 2]; 
formatParameters[0] = "5435534"; 
formatParameters[1] = "John"; 
for (int i = 0; i < parameters.length; i++) { 
    formatParameters[i + 2] = parameters[i]; 
} 
return String.format(URL, formatParameters); 

Beachten Sie, dass formatParametersObject[] sein muss, damit dies funktioniert (Ich glaube nicht, dass es mit String[] funktioniert). Dadurch wird der Compiler dazu gebracht, zu erkennen, dass Sie anstelle eines einzelnen Parameters, dessen Typ zufällig ein Array ist, ein Array von Parametern übergeben.

(Hinweis: Es sollte Methoden in Arrays, die von parameters bis formatParameters ohne eine Schleife kopieren könnte, aber ich habe nicht Lust, sie jetzt nachschlagen.)

Verwandte Themen