You are on page 1of 12

Cadenas de tipo StringBuffer

Las cadenas de la clase String una vez creadas son inalterables, son constantes; las
operaciones puede que generen otra cadena y la original permanecer constante. Es
preferible que las cadenas, si no se prev que experimente cambios, definirlas del tipo
String porque Java las maneja ms eficientemente.
En muc!as aplicaciones se necesitan cadenas que cambian dinmicamente, en cuanto a
que se expanden o se reducen, o bien se modifica el contenido. "ara trabajar con estas
cadenas dinmicas Jaca dispone de la clase StringBuffer.
Constructores de StringBuffer
#na vez declarada una variable StringBuffer, la inicializaci$n s$lo se puede !acer con
alguno de los tres constructores de la clase y el operador new.
1. Constructor de cadena vaca.
%rea una cadena vac&a, sin caracteres, aunque estable la capacidad inicial a 16
caracteres.
StringBuffer c;
c = new StringBuffer();
2. Constructor a partir de otra cadena .
Este constructor crea una cadena dinmica a partir de otro objeto cadena ya creado y
devuelve la referencia al objeto creado.

String cad = "Paloma de altos vuelos";
StringBuffer nvd = new StringBuffer(cad);
El objeto cadena creado reserva espacio para tantos caracteres como cad mas 16, su
capacidad es cad.length() + 16.
3. Constructor con una capacidad .

Este constructor crea una cadena vac&a con una capacidad que es el argumento entero
transmitido.
StringBuffer ca = new StringBuffer(!1);
Aadir e insertar en StringBuffer
El mtodo aend() se utiliza para a'adir al final de la cadena. "uede a'adirse otra
cadena, o bien un array de caracteres, o cualquier dato de los tipos primitivos de Java.
( )u ocurre si no tiene capacidad la cadena para contener los caracteres a'adidos*+ el
mtodo se encarga de ampliar el n,mero suficiente de elementos para todos los caracteres.
EJEMPLO 1
Formar una cadena que partiendo de una original se vaya aadiendo caracteres que
representan datos de cualquiera de los tipos primitivos.
StringBuffer cad"rig = new StringBuffer("#adena inicial ");
int $ = 1%&;
char ch ='(';
)oolean gf = true;
char arc *+= ,'o'-'.'-'o'/;
cad"rig.aend(ch).aend($);
S0stem.out.rintln("1ctual2 " + cad"rig.toString() +
" caacidad2 " + cad"rig.caacit0());
cad"rig.aend(gf).aend(.1%.&34);
S0stem.out.rintln("1ctual2 " + cad"rig.toString() +
" caacidad2 " + cad"rig.caacit0());
cad"rig.aend(arc).aend(" ; n5mero real").aend(6.%4f);
S0stem.out.rintln("1ctual2 " + cad"rig.toString() +
" caacidad2 " + cad"rig.caacit0());
cad"rig.aend(ch).aend(" ; entero largo2 ").aend(1777778);
S0stem.out.rintln("1ctual2 " + cad"rig.aend(" 9in").toString() +
" caacidad2 " + cad"rig.caacit0());
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
La sobrecarga del operador + y del += para concatenar cadenas est implementada con
llamadas consecutivas a aend(). "or ejemplo+
int ; = 1!;
S0stem.out.rintln("<alor ;2 " + ;);
internamente se produce estas llamadas a aend+
S0stem.out.rintln(
new StringBuffer().aend("<alor ;2 ").aend(;));
La principal diferencia entre insertar y a'adir radica en la posici$n donde se a'ade la
cadena. El mtodo aend() siempre a'ade al final de una cadena, el mtodo insert()
a'ade a partir de una posici$n dada.
"uede insertarse otra cadena, o bien un array de caracteres, o cualquier dato de los
tipos primitivos de Java; el dato que se inserta previamente se transforma a cadena.
insert() tiene dos argumentos, el primero es la posici$n de inserci$n en la cadena
actual, el segundo es el dato a insertar. Los caracteres de la cadena original, a partir de la
posici$n de inserci$n se desplazan a la derec!a tanta posiciones como longitud tenga el
dato a a'adir; si es necesario aumenta la capacidad de la cadena. "or ejemplo+

StringBuffer d = new StringBuffer("8ista de acciones");
int $;
)oolean sw = true;
char*+ ac =,'f'-'i'-'n'/;
d.insert(&-"++"); == resultado2lis++ta de acciones
d.insert(>-'?'); == resultado2lis++ta? de acciones
d.insert(6-sw); == resultado2truelis++ta? de acciones
d.insert(1%-ac); == resultado2truelis++ta?fin de acciones
d.insert(1!-16); == resultado2truelis++ta?fin de 16acciones
EJEMPLO 2
Dada una cadena con ciertos caracteres clave, se quiere aadir en las posiciones
donde se encuentran, datos obtenidos desde el teclado.

-e supone que los caracteres clave son '(' y '@', la cadena original se obtiene del
dispositivo de entrada. En un bucle de tantas iteraciones como longitud tiene la cadena
se pregunta si el carcter actual es una clave, en caso afirmativo se pide el dato y se
inserta.
imort ;ava.io.A;
class cadenaBascara
,
u)lic static void main(String *+ as)throws CDcetion
,
StringBuffer al;
String ce;
BufferedEeader entrada = new BufferedEeader(
new FnutStreamEeader(S0stem.in));
int $;
S0stem.out.rint("GnGtCscri)ir cadena original2 ");
al = new StringBuffer(entrada.read8ine());
for ($ = 6; $ H al.length(); $++)
if (al.char1t($) == '(' II
al.char1t($) == '@')
,
S0stem.out.rint("Cscri)ir dato2 ");
ce = entrada.read8ine();
al.insert($- ce);
$ += ce.length(); == aumenta ara no reetir el carJcter
/
S0stem.out.rintln("Gt#adena resultanteGn" + al);
/
/
EJEMPLO 3.4
Haciendo uso del atributo length se calcula la suma de los elementos de un array de
tipo double.

dou)le suma (dou)le *+ w)
,
dou)le s = 6.6;
for (int i = 6; i H w.length); i++)
s += w*i+;
return s;
/
EJEMPLO 3.
Proteccin frente a errores en el intervalo (rango) de valores de una variable de ndice
que representa un array
int datos(dou)le a*+) throws CDcetion
,
int n;
S0stem.out.rintln("Cntrada de datos- cuantos elementos2 K ");
n = Fnteger.arseFnt(entrada.read8ine());
if (n L a.length)
return 6;
for (int i = 6; i H n; i++)
a*i+= Mou)le.value"f(entrada.read8ine()).dou)le<alue();
return 1;
/
EJE!C"C"O 3.1
!l programa escrito a continuacin lee "#$ enteros en un array, multiplica los
elementos del array y visuali%a el producto.
imort ;ava.io.A;
class Fnicial
,
u)lic static void main(String *+ a) throws F"CDcetion
,
final int NOB = 16;
BufferedEeader entrada = new BufferedEeader(
new FnutStreamEeader(S0stem.in));
int nums*+= new int*NOB+;
int total = 1;
S0stem.out.rintln("Por favor- introduPca " + NOB + " datos");
for (int i = 6; i H NOB; i++)
,
nums*i+ = Fnteger.arseFnt(entrada.read8ine());
/
S0stem.out.rint("Gn8ista de n5meros2 ");
for (int i = 6; i H NOB; i++)
,
S0stem.out.rint(" " + nums*i+);
total A= nums*i+;
/
S0stem.out.rintln("GnCl roducto de los n5meros es " + total);
/
/
EJE!C"C"O 3.2
&e quiere definir dos arrays de tipo double, v y ' con () y *+ elementos respectivamente.
!n el array v se guardan los valores de la funcin e
*,-(
para , (.+. el array ' se
iniciali%a cada elemento al ordinal del elemento. / continuacin se copian los (+ 0ltimos
elementos de v a partir del elemento (( de '. Por ultimo se escriben los elementos de
ambos arrays.
El programa que se escribe a continuaci$n sigue los pasos indicados en el enunciado. -e
usa la funci$n eD() de la clase Bath para el clculo de la funci$n e
.x/0
; as& como el
mtodo arra0co0() para realizar la copia de elementos de array pedida.
imort ;ava.io.A;
class coi1rra0
,
u)lic static void main(String *+ a)
,
final int N = 14;
final int B = %6;
dou)le *+ v = new dou)le*N+- w = new dou)le *B+;
dou)le D = 1.6;
for (int i = 6; i H N; D+=6.%-i++)
v*i+ = Bath.eD(%AD.1);
for (int i = 6; i H B; i++)
w*i+ = (dou)le)i;
== Se imrimen los elementos del vector v
S0stem.out.rintln("Gn <alores del vector v");
for (int i = 6; i H N; i++)
S0stem.out.rint(v*i+ + " ");
S0stem.out.flush();
== Cs realiPada la coia de v a w
S0stem.arra0co0(v- (N.1).16 +1- w- 16- 16);
== Se imimen los elementos del vector w
S0stem.out.rintln("Gn <alores del vector w");
for (int i = 6; i H B; i++)
S0stem.out.rint(w*i+ + " ");
S0stem.out.flush();
/
/
EJE!C"C"O 3.3
1odificar un programa para dar entrada y posterior visuali%acin de un array de dos
dimensiones.
El mtodo leer() da entrada a los elementos de la matriz que se pasa como argumento, y
el mtodo visualiPar() muestra la tabla en la pantalla.
imort ;ava.io.A;
class ta)la
,
u)lic static void main(String *+ a) throws CDcetion
,
int v*+*+= new int*&+*4+;
leer(v);
visualiPar(v);
/
static void leer(int a*+*+)throws CDcetion
,
int i-;;
BufferedEeader entrada = new BufferedEeader(
new FnutStreamEeader(S0stem.in));
S0stem.out.rintln("Cntrada de datos de la matriP");
for (i = 6; i H a.length; i++)
,
S0stem.out.rintln("9ila2 " + i);
for (; = 6; ; H a*i+.length; ;++)
a*i+*;+= Fnteger.arseFnt(entrada.read8ine());
/
/
static void visualiPar (int a*+*+)
,
int i-;;
S0stem.out.rintln("GnGt BatriP leidaGn");
for (i = 6; i H a.length; i++)
,
for (; = 6; ; H a*i+.length; ;++)
S0stem.out.rint(a*i+*;+ + " ");
S0stem.out.rintln(" ");
/
/
/
EJE!C"C"O 3.4
Paso de arrays a m2todos. &e lee un array y se escribe el producto de los elementos
positivos.
El n,mero de elementos del array se establece en la ejecuci$n del programa. 1l
mtodo leer1rra0()se le pasa el array para dar entrada a sus valores. 1l
mtodo roducto() tambin se le pasa el array; devuelve el producto de
los elementos positivos.
imort ;ava.io.A;
class ProductoBat
,
static BufferedEeader entrada = new BufferedEeader(
new FnutStreamEeader(S0stem.in));
u)lic static void main(String *+ a)throws CDcetion
,
dou)le v*+;
int n;
S0stem.out.rint("N5mero de elementos2 ");
n = Fnteger.arseFnt(entrada.read8ine());
v = new dou)le*n+;
leer1rra0(v);
S0stem.out.rintln("Cl roducto de los elementos= " +
roducto(v));
/
static void leer1rra0(dou)le a*+)throws CDcetion
,
int n = 6;
S0stem.out.rintln("FntroduPca " + a.length + "datos.");
for (; n H a.length; n++)
,
a*n+ = Mou)le.value"f(entrada.read8ine()).dou)le<alue();
/;
/
static dou)le roducto(dou)le w*+)
,
dou)le d = 1.6;
int n = w.length . 1;
while (n L 6)
if (w*n+ L 6.6)
d A= w*n..+;
else
n..;
return d;
/
/
EJEMPLO 3.#

!l m2todo &umaDe!nteros()suma los valores de los n elementos de un array y devuelve
la suma.
int SumaMeCnteros(int*+arra0Cnteros- int n)
,
int i- s;
for (i = s = 6; i H n; )
s += arra0enteros*i+++;
return s;
/
EJE!C"C"O 3.
&e lee una lista de cmo m3,imo *( n0meros enteros, a continuacin se calcula su suma
y el valor m3,imo. 4a entrada de datos termina al introducir la clave -(
El programa consta del mtodo entrada() que lee desde el teclado los elementos del
array !asta que se lee el dato clave, devuelve el n,mero de elementos le&do que nunca
puede ser mayor que el mximo de elementos 2atributo length3. El mtodo
sumaCnteros() calcula la suma de los elementos introducidos en el array, se pasan dos
parmetros, el array y el n,mero de elementos. El mtodo maDimo() tiene los mismos
parmetros que sumaCnteros(), determina el valor mximo.
imort ;ava.io.A;
class SumaBaD
,
u)lic static void main(String *+ a)throws CDcetion
,
final int NOB = %1;
int items*+ = new int*NOB+;
int n;
n = entrada(items); == devuelve el n5mero real de elementos
S0stem.out.rintln("GnSuma de los elementos2 " +
sumaCnteros(items-n));
S0stem.out.rintln("Gn<alor mJDimo2 " + maDimo(items-n));
/
static int entrada(int w*+)throws CDcetion
,
int $ = 6- D;
BufferedEeader entrada = new BufferedEeader(
new FnutStreamEeader(S0stem.in));
S0stem.out.rintln("FntroduPca un mJDimo de " + w.length +
"datos- terminar con .1");
do ,
D = Fnteger.arseFnt(entrada.read8ine());
if (D ?= .1 )
w*$+++ = D;
/while (($ H w.length) @@ (D ?= .1));
return $;
/
static int sumaCnteros(int w *+- int n)
,
int i- total = 6;
for (i = 6; i H n; i++)
total += w*i+;
return total;
/
static int maDimo(int w*+- int n)
,
int mD- i;
mD = w*6+;
for (i = 1; i H n; i++)
mD = (w*i+LmD ? w*i+2 mD);
return mD;
/
/
EJE!C"C"O 3.$
#tili%ar un vector para guardar indistintamente, n0meros racionales y n0meros
comple5os.
-e supone que un n,mero racional est representado por dos enteros, numerador y
denominador respectivamente. #n n,mero complejo tambin viene representado por
dos enteros, parte real y parte imaginaria. Entonces, se declara la clase Numero con los
atributos de tipo entero D, 0; las clases Eacional y #omle;o derivan de Numero.
1dems, el mtodo mostrar() se redefine en cada clase para escribir el tipo de n,mero.
La clase principal crea un vector al que se a'ade n,meros racionales y complejos
alternativamente. 1 continuaci$n se recuperan los elementos y se escriben.
imort ;ava.util.A;
imort ;ava.io.A;
a)stract class Numero
,
rotected int D- 0;
u)lic Numero() ,;/
u)lic Numero(int :D- int :0)
,
D = :D;
0 = :0;
/
a)stract void mostrar();
/
class Eacional eDtends Numero
,
u)lic Eacional() ,;/
u)lic Eacional(int :D- int :0) , suer(:D- :0); /
void mostrar()
,
S0stem.out.rintln(D + "=" + 0);
/
/

class #omle;o eDtends Numero
,
u)lic #omle;o() ,;/
u)lic #omle;o(int :D- int :0) , suer(:D- :0); /
void mostrar()
,
S0stem.out.rintln("(" + D + "-" + 0 + ")");
/
/
u)lic class <ectorNumero
,
static final int N = 16;
u)lic static void main (String *+ a)
,
<ector num = new <ector();
for(int i = 1; i H= N; i++)
,
Numero Q;
Q = new Eacional(& A i- & A i R > + 1);
num.addClement(Q);
Q = new #omle;o(& A i R >- & A i . 4);
num.addClement(Q);
/
== recueraciSn de los elementos
int $;
$ = num.siPe(); == n5mero de elementos
for (int i = 1; i H= N; i++)
,
Numero Q;
Q = (Numero) num.element1t(i);
Q.mostrar();
/
/
/

You might also like