Foro de elhacker.net

Programación => Java => Mensaje iniciado por: m@o_614 en 17 Febrero 2015, 03:50 am



Título: dudas con arreglos
Publicado por: m@o_614 en 17 Febrero 2015, 03:50 am
Saludos

Tengo una duda sobre el manejo de arreglos

Yo tengo una clase en la que tengo declarado como atributo una variable global array de tipo byte[] de tamaño 50. y en esa clase también tengo un metodo que se llama send() y al cual desde el main con un ciclo le voy a ir pasando arreglos de distintos tamaños y se los voy a tener que concatenar a ese arreglo global, byte[]. con cada llamada a send().

Código
  1. class Nucleo{
  2. static byte[] buffer = new byte[50];
  3. public void send(byte[] mensaje){
  4. for(int i = 0;i < mensaje.length;i++)
  5. {
  6.    buffer[i] = mensaje[i];
  7. }
  8. }
  9. }
  10. }

en este codigo le paso un mensaje que es un array de bytes y se lo concateno a buffer. Pero el problema es que el codigo solo funcionaría la primera vez que llamo a send(), y las demas veces ya no lo podria concatenar. ¿cómo podría resolver esto?

de antemano gracias


Título: Re: dudas con arreglos
Publicado por: El Benjo en 17 Febrero 2015, 06:11 am
Eso es porque siempre comienzas en la posición 0 del arreglo, es decir que para que los datos se guardaran al final de tu arreglo deberías declarar la variable i como una variable global, en el for inicializar i a su propio valor en vez del 0.

Código
  1. class Nucleo{
  2. static byte[] buffer = new byte[50];
  3.        int i;
  4. public void send(byte[] mensaje){
  5.                int i_inicial = i;
  6. for(i = i;i < i_inicial + mensaje.length;i++)
  7. {
  8.    buffer[i] = mensaje[i];
  9. }
  10. }
  11. }
  12. }

Pero te recomiendo que para eso utilices los métodos de la clase Array, Copy(), etc.


Título: Re: dudas con arreglos
Publicado por: 3n31ch en 17 Febrero 2015, 08:02 am
Ay dios mio, me van a matar.

Esto ya lo dije en un tema (http://foro.elhacker.net/java/como_puedo_ordenar_2_arraylist-t430001.0.html), las variables GLOBALES no existe en Java. Eso es una variable de CLASE.

Dejando eso claro, intentare responder tu pregunta.

Como dice @El Benjo Lo que pasa es que empiezas desde el indice 0 siempre, por lo cual siempre re-definirás los primeros datos ingresados.

Por otro lado siempre que tengas un arreglo en el cual necesites modificar su longitud es mejor trabajar con listas. (En la actualidad tu programa explotaría si yo hago paso como parámetro un array de 51 elementos).

Si te rehúsas a utilizar listas o cualquier cosa por alguna razón, podrías complicarte la vida haciendo algo como esto:

    
Código
  1. public static byte[] buffer;
  2.  
  3.    public void send(byte[] mensaje) {
  4.        if (Nucleo.buffer == null) {
  5.            Nucleo.buffer = mensaje;
  6.        } else {
  7.            byte[] newBuffer = new byte[Nucleo.buffer.length+mensaje.length];
  8.            for (int i = 0; i < newBuffer.length; i++) {
  9.                if (i < Nucleo.buffer.length) {
  10.                    newBuffer[i] = Nucleo.buffer[i];
  11.                } else {
  12.                    newBuffer[i] = mensaje[i-Nucleo.buffer.length];
  13.                }
  14.            }
  15.            Nucleo.buffer = newBuffer;
  16.        }
  17.    }

Ahora te doy mis recomendaciones que doy a todos. (Lamento ser un pesado)

1. No utilices variables de clase amenos que sea totalmente necesario. (Existen casos en que lo es, por ejemplo en el patrón de diseño Singleton) - Para saber mas de patrones de diseño haz clic aquí (http://foro.elhacker.net/java/guia_patrones_de_diseno_parte_1-t429045.0.html).

2. No hagas clases, métodos o variables friendly (encapsulamiento default), es una mala practica, la encapsulación no debe depender de la arquitectura o distribución de tu proyecto.

Código
  1. public class Nucleo {
  2.    public static byte[] buffer;
  3. }

3. Cuando abras llaves "{" ponlo en la misma linea que la sentencia separados por un espacio del paréntesis (). Por ejemplo:

Código
  1. public void myMethod() {
  2.  
  3. }

4. En sentencias if, for, while.... (sentencias, no métodos, que reciban parámetros) separa los paréntesis de la sentencia.

Código
  1. if (condition) {
  2.  
  3. }

Esto que te mencione de las 3 y 4 no harán que tu programa sea mejor, pero si hará que tu código lo sea. Es como la ortografía, se entiende, pero los ojos sangran.

Para saber mas de las buenas practicas y convenciones de Java haz clic aquí (http://foro.elhacker.net/java/aporte_buenas_practicas_y_convenciones_en_java_parte_uno_convenciones-t428844.0.html)

(Podría darte un par de consejos mas como que cuides mas tu indentado, pero ya es suficiente)

PD: Por favor, dejen de referirse a las variables "estaticas" como variables globales, los novatos se confunden.

PD2: Felicitaciones @m@o_614 tomaste mi consejo de volver a lo básico, sigue así y tu lógica mejorara muchísimo.  ;-) ;-) ;-)