write traductor traducir significa qué ingles gratis frases español diccionario convertidor buscar java guava textwrapping

java - traducir - traductor de frases en ingles a español gratis



¿Puedo envolver el texto a un ancho determinado con guayaba? (4)

Aquí está mi propia respuesta, para la inspiración:

public final class TextWrapper { enum Strategy implements WrapStrategy { HARD { @Override public String wrap(final Iterable<String> words, final int width) { return Joiner.on(''/n'') .join(Splitter .fixedLength(width) .split( Joiner.on('' '').join(words))); } }, SOFT { @Override public String wrap(final Iterable<String> words, final int width) { final StringBuilder sb = new StringBuilder(); int lineLength = 0; final Iterator<String> iterator = words.iterator(); if (iterator.hasNext()) { sb.append(iterator.next()); lineLength=sb.length(); while (iterator.hasNext()) { final String word = iterator.next(); if(word.length()+1+lineLength>width) { sb.append(''/n''); lineLength=0; } else { lineLength++; sb.append('' ''); } sb.append(word); lineLength+=word.length(); } } return sb.toString(); } } } interface WrapStrategy { String wrap(Iterable<String> words, int width); } public static TextWrapper forWidth(final int i) { return new TextWrapper(Strategy.SOFT, CharMatcher.WHITESPACE, i); } private final WrapStrategy strategy; private final CharMatcher delimiter; private final int width; TextWrapper(final WrapStrategy strategy, final CharMatcher delimiter, final int width) { this.strategy = strategy; this.delimiter = delimiter; this.width = width; } public TextWrapper hard(){ return new TextWrapper(Strategy.HARD, this.delimiter, this.width); } public TextWrapper respectExistingBreaks() { return new TextWrapper( this.strategy, CharMatcher.anyOf(" /t"), this.width); } public String wrap(final String text) { return this.strategy.wrap( Splitter.on(this.delimiter).split(text), this.width); } }

Ejemplo de uso 1: (envoltura dura a 80 caracteres)

TextWrapper.forWidth(80) .hard() .wrap("Lorem ipsum dolor sit amet, consectetur adipiscing elit./n" + "Maecenas porttitor risus vitae urna hendrerit ac condimentum " + "odio tincidunt./nDonec porttitor felis quis nulla aliquet " + "lobortis. Suspendisse mattis sapien ut metus congue tincidunt. " + "Quisque gravida, augue sed congue tempor, tortor augue rhoncus " + "leo, eget luctus nisl risus id erat. Nunc tempor pretium gravida.");

Salida:

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas porttitor risu s vitae urna hendrerit ac condimentum odio tincidunt. Donec porttitor felis quis nulla aliquet lobortis. Suspendisse mattis sapien ut metus congue tincidunt. Qu isque gravida, augue sed congue tempor, tortor augue rhoncus leo, eget luctus ni sl risus id erat. Nunc tempor pretium gravida.

Ejemplo de uso 2: (ajuste suave en o antes de 60 caracteres, mantener los saltos de línea existentes)

TextWrapper.forWidth(60) .respectExistingBreaks() .wrap("Lorem ipsum dolor sit amet, consectetur adipiscing elit./n" + "Maecenas porttitor risus vitae urna hendrerit ac condimentum " + "odio tincidunt./nDonec porttitor felis quis nulla aliquet " + "lobortis. Suspendisse mattis sapien ut metus congue tincidunt. " + "Quisque gravida, augue sed congue tempor, tortor augue rhoncus " + "leo, eget luctus nisl risus id erat. Nunc tempor pretium gravida.");

Salida:

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas porttitor risus vitae urna hendrerit ac condimentum odio tincidunt. Donec porttitor felis quis nulla aliquet lobortis. Suspendisse mattis sapien ut metus congue tincidunt. Quisque gravida, augue sed congue tempor, tortor augue rhoncus leo, eget luctus nisl risus id erat. Nunc tempor pretium gravida.

Me gustaría poder envolver una cadena larga en una longitud fija. ¿Hay una manera de hacer eso en la Guava ?

Apache Commons / Lang tiene el método WordUtils.wrap(String, length) que hace exactamente lo que necesito. ¿Tiene la guayaba un medio simple para lograr esto?

Sé que puedo hacer una envoltura dura con Splitter.fixedLength(int) , pero me gustaría una envoltura suave.

ACTUALIZACIÓN: Ahora hay una recompensa por esta pregunta.

Obviamente, esta funcionalidad no está disponible en Guava fuera de la caja, por lo que la recompensa se dirige a la respuesta más concisa (o más completa) y de tipo guayaba que usa lo que hay en Guava. No se permiten libs excepto guayaba.


Hice esto por diversión solo para hacer la mayor cantidad posible de guayaba. la respuesta de javanna es mejor,

import java.util.Iterator; import com.google.common.base.Joiner; import com.google.common.base.Splitter; import com.google.common.collect.Iterators; import com.google.common.collect.PeekingIterator; public class SoftSplit { public static String softSplit(String string, int length) { //break up into words Iterable<String> words = Splitter.on('' '').split(string); //an iterator that will return the words with appropriate //white space added final SoftSplitIterator softIter = new SoftSplitIterator(words, length); return Joiner.on("").join(new Iterable<String>() { @Override public Iterator<String> iterator() { return softIter; } }); } static class SoftSplitIterator implements Iterator<String> { private final int maxLength; private final PeekingIterator<String> words; private int currentLineLength; SoftSplitIterator(Iterable<String> words, int maxLength) { this.words = Iterators.peekingIterator(words.iterator()); this.maxLength = maxLength; } @Override public boolean hasNext() { return words.hasNext(); } @Override public String next() { String current = words.next(); //strip leading spaces at the start of a line if(current.length() == 0 && currentLineLength == 0) { return ""; } //nothing left after us if(!words.hasNext()) { return current; } String next = words.peek(); if(currentLineLength + current.length() + next.length() < maxLength) { //this word and the next one won''t put us over limit currentLineLength += current.length(); return current + " "; } else { //the next word will put us over the limit //add a line break currentLineLength = 0; return current + "/n"; } } @Override public void remove() { throw new UnsupportedOperationException(); } } public static void main(String[] args) { String text = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. " + "Maecenas porttitor risus vitae urna hendrerit ac condimentum " + "odio tincidunt. Donec porttitor felis quis nulla aliquet " + "lobortis. Suspendisse mattis sapien ut metus congue tincidunt. " + "Quisque gravida, augue sed congue tempor, tortor augue rhoncus " + "leo, eget luctus nisl risus id erat. Nunc tempor pretium gravida."; System.out.println(softSplit(text, 60)); } }


Nosotros (Guava) te recomendamos encarecidamente que uses la clase BreakIterator de BreakIterator para manejar la mecánica de encontrar puntos de ruptura en el texto del usuario.


¿Por qué usar la guayaba para hacer algo más simple sin la guayaba?

De hecho, la clase Splitter permite hacer una envoltura dura con el método fixedLength() , de lo contrario, puede dividir una cadena dependiendo de un char separador o una String . Si desea usar guayaba, puede confiar en Splitter.on('' '').split(string) , pero también debe unir los resultados reemplazando '''' con ''/ n'' dependiendo del valor de maxLength.

Sin usar guayaba, también puedes hacer lo que quieras. Unas líneas de código, sin dependencias . Básicamente, puede utilizar el enfoque de commons-lang, simplificándolo. Este es mi método de envoltura:

public static String wrap(String str, int wrapLength) { int offset = 0; StringBuilder resultBuilder = new StringBuilder(); while ((str.length() - offset) > wrapLength) { if (str.charAt(offset) == '' '') { offset++; continue; } int spaceToWrapAt = str.lastIndexOf('' '', wrapLength + offset); // if the next string with length maxLength doesn''t contain '' '' if (spaceToWrapAt < offset) { spaceToWrapAt = str.indexOf('' '', wrapLength + offset); // if no more '' '' if (spaceToWrapAt < 0) { break; } } resultBuilder.append(str.substring(offset, spaceToWrapAt)); resultBuilder.append("/n"); offset = spaceToWrapAt + 1; } resultBuilder.append(str.substring(offset)); return resultBuilder.toString(); }

Sí, es muy similar al método de commons-lang original, pero creo que más corto, más fácil y basado en sus necesidades. Tal vez, esta solución también es más eficiente que la tuya, ¿no?

Lo he probado con su texto, comparando mi resultado con el resultado de commons-lang. Parece funcionar:

public static void main(String[] args) { String string = "Lorem ipsum dolor sit amet, consectetur adipiscing elit./n" + "Maecenas porttitor risus vitae urna hendrerit ac condimentum " + "odio tincidunt./nDonec porttitor felis quis nulla aliquet " + "lobortis. Suspendisse mattis sapien ut metus congue tincidunt. " + "Quisque gravida, augue sed congue tempor, tortor augue rhoncus " + "leo, eget luctus nisl risus id erat. Nunc tempor pretium gravida."; for (int maxLength = 2; maxLength < string.length(); maxLength++) { String expectedResult = WordUtils.wrap(string, maxLength); String actualResult = wrap(string, maxLength); if (!expectedResult.equals(actualResult)) { System.out.println("expectedResult: /n" + expectedResult); System.out.println("/nactualResult: /n" + actualResult); throw new RuntimeException( "actualResult is not the same as expectedResult (maxLength:" + maxLength + ")"); } } }

Entonces, el asunto es: ¿realmente quieres usar guayaba para hacer esto? ¿Cuáles son los beneficios relacionados con esta elección?