JavaRush /Blog Java /Random-ES /clase de cadena
articles
Nivel 15

clase de cadena

Publicado en el grupo Random-ES
  • Métodos
  • Generando una cadena aleatoria
  • Comparación de cadenas: equals()o ==?
Los programadores utilizan esta clase Stringcon mucha frecuencia, por lo que conviene aprenderla muy bien. Cadena de clase - 1Recuerde que los objetos de clase Stringson inmutables. Entonces, cuando crees que estás cambiando una cadena, en realidad estás creando una nueva cadena. Java tiene clases especiales StringBufferque StringBuilderpermiten cambios en una cadena. Las clases String, StringBufferestán StringBuilderdefinidas en el paquete java.lang y están disponibles automáticamente sin una declaración de importación. Las tres clases implementan la interfaz CharSequence. Crear una cadena es muy simple. Por ejemplo, puedes hacer esto:
String aboutCat = "Кот - это звучит гордо, а если наступить на хвост, то громко";
Puede crear una serie de cadenas:
String[] cats = {"Васька", "Barsik", "Murzik"};
Puedes crear un objeto de clase vacío String:
String str = new String();
Puedes crear una cadena a través de una matriz de caracteres:
char[] chars = { 'c', 'a', 't' };
String str = new String(chars);
También hay un constructor que le permite establecer el rango de una matriz de caracteres. Debe especificar el inicio del rango y la cantidad de caracteres a usar:
char[] chars = {'c', 'a', 't', 'a', 'm', 'a', 'r', 'a', 'n' };
String str = new String(chars, 0, 3);
Puede crear un objeto de clase Stringa partir de un objeto de clases StringBufferutilizando StringBuilderlos siguientes constructores:
String(StringBuffer un objeto_StrBuf)
String(StringBuilder un objeto_StrBuild)

Operadores +y += paraString

En Java, el signo más ( +) significa concatenación de cadenas, en otras palabras, combinación de cadenas.
String cat = "Кот";
String name = "Васька";
//складываем две строки и пробел между ними, чтобы слова не слиплись
String fullname = cat + " " + name; // получится Кот Васька
Si uno de los operandos de una expresión contiene una cadena, los demás operandos también deben ser cadenas. Por lo tanto, el propio Java puede convertir variables en una representación de cadena, incluso si no son cadenas.
int digit = 4;
String paws = " лапы";
String aboutcat = digit + paws; // хотя мы складываем число и строку, но все равно получим строку
За кулисами Java за нас преобразовало число 4 в строку "4"

Formatear cadenas

Supongamos que tenemos un recurso de cadena:
<string name="aboutcat">У кота по имени Барсик четыре лапы, один хвост. Ему 5 лет</string>
Para mostrar esta cadena mediante programación en el elemento TextView, puede usar el código:
TextView tvCatsInfo = (TextView)findViewById(R.id.textView1);
tvCatsInfo.setText(R.string.aboutcat);
Imagina que tienes varios gatos. Por supuesto, puedes tener tu propia línea para cada gato. Pero las líneas son muy similares, sólo cambian los nombres y las edades. También puedes cambiar el número de patas y colas (¿qué estás fumando?). En tales casos, puede aplicar formato de cadena. Necesitamos determinar las palabras que cambiaremos y reemplazarlas con un conjunto especial de caracteres que comienzan con un símbolo de porcentaje, luego un número que aumenta en uno, luego $spara cadenas o $dnúmeros. Así que cambiemos nuestro recurso de cadena de esta manera:
<string name="aboutcat">У кота по имени %1$s %2$s лапы, %3$s хвост. Ему %4$d лет</string>
Hagamos cambios en el código:
String strBarsik = "Barsik";
String strPaws = "четыре";
String strTail = "uno";
int year = 5;
String strCats = getResources().getString(R.string.aboutcat);
String strFinal = String.format(strCats, strBarsik, strPaws, strTail, year);
tvCatsInfo.setText(strFinal);
Si tienes un gato Vaska y tiene seis años, agrega dos variables y formatea la línea.
String strVaska = "Васька";
year = 6;
String strFinal = String.format(strCats, strVaska, strPaws, strTail, year);
tvCatsInfo.setText(strFinal);
A continuación se muestra un ejemplo de formato sencillo. Recuérdalo y úsalo en los lugares correctos.

recurso de cadena

Es recomendable almacenar cadenas en recursos. El acceso programático a un recurso de cadena se realiza así:
String catName = getResources().getString(R.string.barsik);

Extraiga cadenas de matrices de cadenas en recursos

Digamos que tiene una matriz de cadenas definida en el archivo strings.xml llamado cats_array. Luego puede acceder a filas de recursos como este:
Resources res = getResources();
String[] cats = res.getStringArray(R.array.cats_array);

Métodos

public char charAt (int index) Devuelve el carácter en el desplazamiento especificado en esta cadena. La cuenta atrás empieza desde 0. No es necesario utilizar valores negativos e inexistentes, sé más serio. Para extraer varios caracteres utilice getChars().
String testString = "Котёнок";
char myChar = testString.charAt(2);
tv.setText(Character.toString(myChar)); // выводит третий символ - т
public int codePointAt(int index) Devuelve el carácter Unicode en el índice dado.
String testString = "Котёнок";
int myChar = testString.codePointAt(3);
tv.setText(String.valueOf(myChar)); // возвращает 1105
public int codePointBefore(int index) Devuelve el carácter Unicode que precede al índice dado
String testString = "Котёнок";
int myChar = testString.codePointBefore(4);
tv.setText(String.valueOf(myChar)); // возвращает 1105
public int codePointCount(int start, int end) Calcula el número de caracteres Unicode entre posiciones startyend
String testString = "Котёнок";
int myChar = testString.codePointCount(0, 3);
tv.setText(String.valueOf(myChar)); // возвращает 3
public int compareTo(String string) Compara la cadena especificada utilizando valores de caracteres Unicode y calcula qué cadena es menor, igual o mayor que la siguiente. Se puede utilizar para clasificar. Se tiene en cuenta el caso. Si las cadenas coinciden, se devuelve 0, si es menor que cero, entonces la cadena que llama es menor que la cadena string, si es mayor que cero, entonces la cadena que llama es mayor que la cadena string. Las palabras en mayúsculas se colocan encima de las minúsculas.
String testString = "Котёнок";

if (testString.compareTo("котёнок") == 0) {
    tvInfo.setText("Строки равны");
} else {
    tvInfo.setText("Строки не равны. Возвращено"
            + testString.compareTo("котёнок")); // возвращает -32
}
Clasifiquemos la matriz de cadenas usando la clasificación de burbujas.
String[] poem = { "Мы", "везём", "с", "собой", "кота" };

for (int j = 0; j < poem.length; j++) {
	for (int i = j + 1; i < poem.length; i++) {
		if (poem[i].compareTo(poem[j]) < 0) {
			String temp = poem[j];
			poem[j] = poem[i];
			poem[i] = temp;
		}
	}
	System.out.println(poem[j]);
}
Como resultado obtenemos:
Мы
везём
кота
с
собой
Como puede ver, cambiar los lugares de los términos no cambia la suma de clasificación de los gatos. public int compareToIgnoreCase (String string) Compara la cadena especificada utilizando valores de caracteres Unicode, sin distinguir entre mayúsculas y minúsculas.
String testString = "Котёнок";

if (testString.compareToIgnoreCase("котёнок") == 0) {
    tv.setText("Строки равны"); // слова одинаковы, если не учитывать регистр
} else {
    tv.setText("Строки не равны. Возвращено"
            + testString.compareTo("котёнок"));
}
public String concat (String string) Concatena una cadena con la cadena especificada. Se devuelve una nueva cadena que contiene la concatenación de las dos cadenas. ¡Tenga en cuenta que el nombre del método en sí contiene un gato!
String testString = "Сук";
String newString = testString.concat("кот");
tv.setText(newString);
El método realiza la misma función que el operador +y podría escribirse Сук + кот. Pero una verdadera persona que ama los gatos utilizará el método del "gato". public boolean contains (CharSequence cs) Determina si una cadena contiene una secuencia de caracteres enCharSequence
String testString = "котёнок";

if(testString.contains("кот")){
    infoTextView.setText("В слове котёнок содержится слово кот!");
}
public static String copyValueOf (char[] data, int start, int length) Crea una nueva cadena que contiene los caracteres especificados de la matriz Datacomenzando en la posición start(numeración basada en cero) de longitud . public static String copyValueOf(char[] data) Crea una nueva cadena que contiene caracteres de la matriz especificada. Cambiar la matriz después de crear la fila no cambia la fila creada. public boolean endsWith(String suffix) Comprueba si una cadena termina en suffix.
String str1 = "Суккот";

if(str1.endsWith("кот"))
    infoTextView.setText("Слово заканчивается на котике");
else
    infoTextView.setText("Плохое слово. Нет смысла его использовать");
public boolean equals (Object string) Compara el objeto especificado y una cadena y devuelve verdadero si las cadenas comparadas son iguales, es decir. contiene los mismos caracteres y en el mismo orden, distinguiendo entre mayúsculas y minúsculas.
String str1 = "Кот";
String str2 = "Кошка";

if(str1.equals(str2))
    infoTextView.setText("Строки совпадают");
else
    infoTextView.setText("Строки не совпадают");
El método no debe confundirse con el operador ==, que compara dos referencias de objetos y determina si se refieren a la misma instancia. Ver Comparación de cadenas: equals()o ==? public boolean equalsIgnoreCase(String string) Compara la cadena especificada con la cadena de origen sin distinguir entre mayúsculas y minúsculas y devuelve verdadero si son iguales. El rango AZ se considera igual al rango az.
String str1 = "Кот";
String str2 = "кот";

if(str1.equalsIgnoreCase(str2))
    infoTextView.setText("Строки совпадают");
else
    infoTextView.setText("Строки не совпадают");
public static String format(Locale locale, String format, Object... args)
Devuelve una cadena formateada utilizando el formato proporcionado y argumentos localizados en el ámbito dado. Por ejemplo fecha u hora
// выводим число типа float с двумя знаками после запятой
String.format("%.2f", floatValue);
Pegamos dos palabras que aparecen en una nueva línea. En este caso, la segunda palabra se muestra en mayúsculas.
String str1 = "Кот";
String str2 = "васька";
String strResult = String.format("%s\n%S", str1, str2);
// выводим результат в TextView
infoTextView.setText(strResult);
Convierte el número al sistema octal.
String str1 = "8";
int inInt = Integer.parseInt(str1); // конвертируем строку в число
String strResult = String.format("(Восьмеричное significado): %o\n", inInt);

infoTextView.setText(strResult);
Por analogía, mostramos en sistema hexadecimal.
String str1 = "255";
int inInt = Integer.parseInt(str1);
String strResult = String.format("(Шестнадцатеричное significado): %x\n", inInt);
// число 255 будет выведено Cómo ff
infoTextView.setText(strResult);
Para uso en mayúsculas %X, entonces ffserá FF. Para uso del sistema decimal %d. La fecha también se puede mostrar de diferentes formas.
Date now = new Date();
Locale locale = Locale.getDefault();
infoTextView.setText(
		String.format(locale, "%tD\n", now) + // (MM/DD/YY)
		String.format(locale, "%tF\n", now) + // (YYYY-MM-DD)
		String.format(locale, "%tr\n", now) + // Full 12-hour time
		String.format(locale, "%tz\n", now) + // Time zone GMT offset
		String.format(locale, "%tZ\n", now)); // Localized time zone bbreviation
public byte[] getBytes(String charsetName) Devuelve una cadena formateada utilizando el formato proporcionado. public void getBytes(int start, int end, byte[] data, int index)y otras sobrecargas El método almacena caracteres en una matriz de bytes, una alternativa al método getChars(). A menudo se utiliza al exportar cadenas de diversas fuentes que utilizan otros caracteres Unicode. Por ejemplo, Java funciona de forma predeterminada con caracteres Unicode de 16 bits y, en Internet, las cadenas suelen utilizar Unicode de 8 bits, ASCII, etc. public void getChars(int start, int end, char[] buffer, int index) Método para extraer varios caracteres de una cadena. Debe especificar el índice del comienzo de la subcadena ( start), el índice del carácter que sigue al final de la subcadena que se extraerá (end). El array que recibe los caracteres seleccionados se encuentra en el parámetro buffer . El índice de la matriz a partir del cual se escribirá la subcadena se pasa en el parámetro de índice . Asegúrese de que la matriz sea lo suficientemente grande como para contener todos los caracteres de la subcadena especificada.
String unusualCat = "Котёнок по имени Гав";
int start = 5;
int end = 12;
char[] buf = new char[end - start];
unusualCat.getChars(start, end, buf, 0);
infoTextView.setText(new String(buf));
public int hashCode() Devuelve un número entero que es el código hash de este objeto. public int indexOf(int c) Devuelve el número de la primera posición encontrada con el índice especificado c.
String testString = "котёнок";
// символ ё встречается в четвёртой позиции (index = 3)
infoTextView.setText(String.valueOf(testString.indexOf("ё")));
public int indexOf (int c, int start) Busca el índice desde la posiciónstart
String testString = "котёнок";
// вернёт -1, так Cómo после 5 символа буквы ё нет
infoTextView.setText(String.valueOf(testString.indexOf("ё", 4)));
public int indexOf (String string) Busca una cadena de caracteressubString
String testString = "У окошка";
infoTextView.setText(String.valueOf(testString.indexOf("кошка")));
public int indexOf (String subString, int start) Busca una cadena de caracteres subStringque comience en la posiciónstart
String testString = "У окошка";
infoTextView.setText(String.valueOf(testString.indexOf("кошка", 2)));
public String intern () "Hashes" una cadena public boolean isEmpty () Comprueba si la cadena está vacía
if(catname.isEmpty()) {
    // здесь ваш código
}
Este método apareció en API 9 (Android 2.1). Para dispositivos más antiguos, utilice String.length() == 0 public int lastIndexOf (String string) и другие перегруженные версии Devuelve el número de la última posición encontrada en el índice especificado. Por ejemplo, puedes obtener el nombre del archivo sin extensión de esta manera:
filename.toString().substring(0, filename.getString().lastIndexOf("."));
En este ejemplo, obtenemos la posición del último punto y la subcadena anterior. public int length() Devuelve la longitud de una cadena
String testString = "котёнок";
infoTextView.setText(String.valueOf(testString.length())); // возвращает 7 (семь символов)
public boolean matches(String regularExpression) Comprueba si una cadena coincide con expresiones regulares.
public int offsetByCodePoints (int index, int codePointOffset)
Devuelve una posición ubicada a una distancia codePointOffsetdespués de la posición inicial especificada por el parámetro. index public boolean regionMatches (int thisStart, String string, int start, int length) El método compara la parte especificada de la cadena con otra parte de la cadena. Debe especificar el índice del comienzo del rango de filas del objeto que llama de la clase String. La cadena a comparar se pasa en el parámetro string. El índice del carácter a partir del cual se debe realizar la comparación se pasa en el parámetro starty la longitud de la subcadena a comparar se pasa en el parámetro length. public boolean regionMatches (boolean ignoreCase, int thisStart, String string, int start, int length) Versión sobrecargada. El método compara la parte especificada de una cadena con otra parte de la cadena, ignorando mayúsculas y minúsculas. public String replace(CharSequence target, CharSequence replacement) и другие перегруженные версии Cambia un carácter o secuencia de caracteres targetareplacement
String testString = "ballena";
// меняем и на о
infoTextView.setText(testString.replace("Y", "о")); // возвращается кот
public String replaceAll (String regularExpression, String replacement) public String replaceFirst (String regularExpression, String replacement) Elimina los primeros caracteres usando una expresión regular. Por ejemplo, si necesita eliminar los ceros al comienzo de los números 001, 007, 000024, puede utilizar esta llamada.
String s = "001234-cat";
String s = s.replaceFirst ("^0*", ""); // останется 1234-cat
public String[] split (String regularExpression) и другие перегруженные версии Divide una cadena en una serie de palabras. Por ejemplo, hay una cadena Vaska Ryzhik Murzik Barsik y queremos obtener una serie de nombres de gatos:
String catnames = "Васька Рыжик Мурзик Барсик";
String aCats[] = catnames.split(" ");  // по пробелу
Obtenemos:
aCats[0] = Васька
aCats[1] = Рыжик
aCats[2] = Мурзик
aCats[3] = Барсик
public boolean startsWith(String prefix) Comprueba si una cadena comienza con caracteres prefixdesde el principio de la cadena.
String str1 = "котлета";

if(str1.startsWith("кот"))
    infoTextView.setText("Слово содержит кота");
else
    infoTextView.setText("Плохое слово. Нет смысла его использовать");
public boolean startsWith(String prefix, int start) Comprueba si la cadena dada comienza con caracteres prefixen la posición especificada.
String str1 = "Суккот";

if(str1.startsWith("кот", 3))
    infoTextView.setText("Слово содержит кота");
else
    infoTextView.setText("Плохое слово. Нет смысла его использовать");
public CharSequence subSequence (int start, int end) Similar al método substring(), pero se puede utilizar para CharSequence. public String substring(int start)y otras sobrecargas Crea una nueva secuencia/cadena con caracteres de la cadena dada que comienza en la posición starthasta el final de la línea/termina con el carácter en la posición end. La nueva línea contiene caracteres desde starthasta el final: 1, por lo que tomamos un carácter más.
String testString = "скотина";

infoTextView.setText(testString.substring(1, 4)); // возвращается кот
public char[] toCharArray() Copia los caracteres de esta cadena en una matriz de caracteres. El mismo resultado se puede obtener a través del getChars(). La documentación no recomienda el uso de este método, sugiriendo el archivo charAt().
String unusualCat = "Котёнок по имени Гав";

char[] yomoe = unusualCat.toCharArray();
infoTextView.setText(String.valueOf(yomoe[3]));
public String toLowerCase() и другие перегруженные версии Convierte una cadena a minúsculas. La configuración regional predeterminada controla la conversión. Cadena gato = "Gato"; Cadena inferior = cat.toLowerCase(); infoTextView.setText(inferior); public String toString () Devuelve una cadena. Para la cuerda en sí, que ya es una cuerda, devolver la cuerda no tiene sentido (oh, cómo la doblé). Pero este método es realmente muy útil para otras clases. public String toUpperCase() Convierte una cadena a mayúsculas. La configuración regional predeterminada controla la conversión.
String cat = "Кот";
String upper = cat.toUpperCase();
infoTextView.setText(upper);
public String trim() Elimina espacios al principio y al final de una cadena.
String str = "   Hello Kitty  ".trim();
infoTextView.setText(str);
public static String valueOf(long value)y otras sobrecargas Convierte contenidos (números, objetos, caracteres, matrices de caracteres) en una cadena.
int catAge = 7; // это число

infoTextView.setText(String.valueOf(catAge)); // преобразовано в строку

Generando una cadena aleatoria

Digamos que necesitamos una cadena aleatoria de caracteres determinados.
private static final String mCHAR = "ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890";
private static final int STR_LENGTH = 9; // длина генерируемой строки
Random random = new Random();

public void onClick(View view) {
    TextView infoTextView = (TextView) findViewById(R.id.textViewInfo);
    infoTextView.setText(createRandomString());
}

public String createRandomString() {
    StringBuilder builder = new StringBuilder();
    for (int i = 0; i < STR_LENGTH; i++) {
        int number = random.nextInt(mCHAR.length());
        char ch = mCHAR.charAt(number);
        builder.append(ch);
    }
    return builder.toString();
}

Comparación de cadenas: equals()o ==?

Veamos un ejemplo.
String str1 = "Murzik";
String str2 = new String(str1);
boolean isCat = str1 == str2;

infoTextView.setText(str1 + " == " + str2 + " -> " + isCat);
Aunque las dos variables contienen la misma palabra, estamos ante dos objetos diferentes y el operador ==devolverá false . Una vez, cuando los árboles eran grandes, necesitaba comparar dos cadenas de diferentes fuentes. Aunque las cadenas parecían exactamente iguales, la comparación usando el operador ==arrojó falso y me confundió todas las tarjetas. Y sólo entonces descubrí que necesito usar el archivo equals(). Una cadena en Java es un objeto separado que puede no ser igual a otro objeto, aunque la salida de la cadena puede verse igual en la pantalla. Es solo que Java, en el caso del operador lógico ==(así como !=), compara referencias a objetos (no existe tal problema cuando se trabaja con primitivas):
String s1 = "hello";
String s2 = "hello";
String s3 = s1;
String s4 = "h" + "e" + "l" + "l" + "o";
String s5 = new String("hello");
String s6 = new String(new char[]{'h', 'e', 'l', 'l', 'o'});

infoTextView.setText(s1 + " == " + s2 + ": " + (s1 == s2));
// попробуйте и другие варианты
// infoTextView.setText(s1 + " equals " + s2 + ": " + (s1.equals(s2)));
// infoTextView.setText(s1 + " == " + s3 + ": " + (s1 == s3));
// infoTextView.setText(s1 + " equals " + s3 + ": " + (s1.equals(s3)));
// infoTextView.setText(s1 + " == " + s4 + ": " + (s1 == s4));
// infoTextView.setText(s1 + " equals " + s4 + ": " + (s1.equals(s4)));
// infoTextView.setText(s1 + " == " + s5 + ": " + (s1 == s5)); // false
// infoTextView.setText(s1 + " equals " + s5 + ": " + (s1.equals(s5)));
// infoTextView.setText(s1 + " == " + s6 + ": " + (s1 == s6)); // false
// infoTextView.setText(s1 + " equals " + s6 + ": " + (s1.equals(s6)));
Comentarios
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION