2010-12-02 29 views
1

Certains camarades de classe et moi travaillons sur une tâche de devoir pour Java qui exige que nous imprimions une ArrayList de chaînes à un PrintWriter en utilisant Word Wrap, de sorte qu'aucune sortie ne dépasse 80 caractères . Nous l'avons largement recherché sur Google et ne trouvons aucune méthode basée sur l'API Java pour le faire.Impression d'une ArrayList de chaînes à un PrintWriter avec Word Wrap

Je sais qu'il est généralement «faux» de poser une question sur les devoirs, mais nous cherchons simplement des recommandations sur la meilleure façon de le faire, ou si nous manquons quelque chose dans l'API. Ce n'est pas la majeure partie du devoir, juste une petite exigence de rendement.

Idéalement, je voudrais être en mesure de wordwrap toString ArrayList car il est déjà bien formaté.

+0

Pouvez-vous fournir un peu plus de détails sur la composition des chaînes dans ArrayList? Comme, sont-ils des mots individuels? – seekerOfKnowledge

+0

La classe que nous écrivons analyse les occurrences de mots-clés dans un fichier texte. La ArrayList elle-même contient une collection d'entiers, chacun étant une position de l'occurrence du mot. Je pense que cela peut être juste pour être traité et traité comme une chaîne. L'appel à toString sur ArrayList l'affiche correctement, mais pas avec le retour à la ligne. – wjl

+0

Si l'objet ArrayList contient des entiers, l'appel à la fonction toString formera les valeurs entières sous forme de texte et les affichera.Ce n'est sûrement pas ce que vous voulez; vous ne voulez pas montrer les mots réels aux positions correspondantes? –

Répondre

2

Eh bien, c'est une première pour moi, c'est la première fois qu'un de mes étudiants a posté une question sur l'un des projets que je leur ai assignés. La façon dont il a été formulé, qu'il cherchait un algorithme, et les réponses que vous avez tous partagées me conviennent parfaitement. Cependant, c'est un cas typique d'essayer de rendre les choses trop compliquées. Une partie de la spécification qui n'a pas été mentionnée était que la limite de 80 caractères n'était pas une limite stricte. J'ai dit que chaque ligne du fichier de sortie devait contenir environ 80 caractères. C'était correct d'aller plus de 80 un peu. Dans ma version de la solution, j'ai juste eu un compte courant et ai fait un module du compte pour ajouter la fin de ligne. J'ai varié la valeur du module jusqu'à ce que le fichier de sortie semble correct. Cela a abouti à des lignes avec de petits nombres étant vraiment courtes donc j'ai utilisé un module différent lorsque les nombres étaient petits. Ce n'était pas une grande partie du projet et il est intéressant que cela ait eu autant d'attention.

0

Notre solution était de créer une chaîne temporaire et d'ajouter des éléments un par un, suivi d'une virgule. Avant d'ajouter un élément, vérifiez si l'ajout de la chaîne fait dépasser la longueur de 80 caractères et choisissez si vous souhaitez l'imprimer et le réinitialiser ou simplement l'ajouter.

Cela a toujours le problème avec la virgule supplémentaire, mais cela a été traité tellement de fois que tout ira bien. Je cherchais à éviter cela parce que c'était à l'origine plus compliqué dans ma tête qu'il ne l'est en réalité.

+0

J'ai dû mettre en œuvre ce genre de chose dans divers environnements et langages au fil des ans - y compris des choses comme le rendu manuel du texte en dessinant des images pour les lettres aux positions d'écran appropriées. Après un certain temps, cela devient naturellement naturel. :) Pour les points bonus, réfléchissez à la façon de le faire avec une police à largeur proportionnelle (et non monospace). –

0

Je pense que la meilleure solution est de créer votre propre WrapTextWriter qui encapsule tout autre écrivain et remplace la méthode public void write(String str, int off, int len) throws IOException. Ici, il devrait fonctionner en boucle et effectuer une logique d'emballage.

Cette logique n'est pas aussi simple que str.substring(80). Si vous travaillez avec du texte réel et que vous souhaitez l'envelopper correctement (c'est-à-dire ne coupez pas les mots, ne déplacez pas les comas ou les points sur la ligne suivante, etc.) vous devez implémenter une certaine logique. ce n'est probablement pas trop compliqué mais probablement dépendant de la langue. Par exemple en anglais il n'y a pas d'espace entre le mot et le colon alors qu'en français ils mettent de l'espace entre eux.

Donc, j'ai effectué 5 googling seconde et trouvé le discussion suivant qui peut vous aider.

0
private static final int MAX_CHARACTERS = 80; 

public static void main(String[] args) 
    throws FileNotFoundException 
{ 
    List<String> strings = new ArrayList<String>(); 

    int size = 0; 

    PrintWriter writer = new PrintWriter(System.out, true); // Just as example 

    for (String str : strings) 
    { 
     size += str.length(); 

     if (size > MAX_CHARACTERS) 
     { 
      writer.print(System.getProperty("line.separator") + str); 
      size = 0; 
     } 
     else 
      writer.print(str); 
    } 

} 

Vous pouvez simplement écrire une fonction, comme « void printWordWrap(List<String> strings) », avec cet algorithme à l'intérieur. Je pense que c'est un bon moyen de résoudre votre problème. :)