2010-07-15 7 views
2

Existe-t-il un moyen d'abréger les fonctions print() et toString() en une seule fonction dans une fonction de liste liée Java ou y a-t-il une explication de la raison pour laquelle quelqu'un formaterait de cette façon?Impression de liste liée Java

public void print() { 
    System.out.println(this.toString()); 
} 

@Override 
public String toString() { 
    String display = ""; 
    LinkedList current = this; 
    while (current != null) { 
     display += new Integer(current.head).toString() + ","; 
     current = current.tail; 
    } 
    display = display.substring(0, display.length()-1); 
    return display; 
} 
+1

Pourquoi ne jamais appeler Java ** méthodes ** * functions *? Est-ce que c'est ce qu'on enseigne à l'école aujourd'hui? – BalusC

+0

juste ne faites pas New Entier, utilisez Integer.valueOf – Tom

+0

@BalusC C'est la première fois que j'ai senti la négativité sur stackoverflow et ça me dérange. Non, je suis une programmation auto-apprenante et je viens juste de C++ donc ça a été difficile à la transition – danutenshu

Répondre

4

J'utiliser StringBuilder, car il est plus memery efficace:

public void print() { 
    System.out.println(this.toString()); 
} 

@Override 
public String toString() { 
    StringBuilder display = new StringBuilder(); 
    for(Integer current: this) { 
     display.append(current).append(','); 
    } 
    return display.toString().substring(0, display.length()-1); 
} 
1

Non. Il n'y a aucun moyen de le faire dans Java 6. Future Javas? Je ne sais pas :-)

La façon dont vous le faites, c'est à peu près le moyen le plus concis pour y parvenir.

0

La raison pour laquelle il est fait comme cela est que si vous voulez écrire un certain nombre de classes d'enfants qui déclarent être des chaînes de différentes façons, vous seulement avoir à remplacer la fonction toString() sur chacun, pas la fonction toString() et la fonction print(). Si vous voulez que print() et toString() aient des fonctionnalités différentes, il n'y a pas de raison que vous ne puissiez pas surcharger print() pour ne pas appeler toString().

1

Le code que vous avez montré est très amateur écrit. Concaténant en une chaîne est juste le drapeau rouge principal.

Si vous n'êtes pas trop préoccupé par la performance, vous pourriez stringify toute la liste dans une ligne de code:

return Arrays.deepToString(toArray()); 

Bien sûr, cela dépend des éléments de la liste ayant toString() sensibles méthodes de leur propre.

1

Vous pouvez ajouter un toString() à la classe représentant un noeud de votre liste chaînée:

class Node<T> { 
    T value; 
    Node<T> next; 

    public String toString() { 
     return value + (next != null ? ", " + next : ""); 
    } 
} 

Et puis mettre en œuvre la toString() de votre liste chaînée comme suit:

public class LinkedList<T> { 
    Node<T> head; 

    public String toString() { 
     return "[" + (head != null ? head : "") + "]"; 
    } 
} 

De cette façon, il sera imprime les noeuds récursivement.

La fonction print() à son tour, peut être remplacée par l'impression juste this depuis System.out.println(object) sous les hottes revient String.valueOf(object) qui à son tour sous les capots retourne object != null ? object.toString() : "null".

public void print() { 
    System.out.println(this); 
}