elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.


 


Tema destacado: Deseas probar algunas mejoras a la interfaz del foro? Prueba cake! acerca de


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  Java
| | | |-+  Eliminar las posiciones pares de un array y comprimir el array
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Eliminar las posiciones pares de un array y comprimir el array  (Leído 9,790 veces)
sevedeboa

Desconectado Desconectado

Mensajes: 5


Ver Perfil
Eliminar las posiciones pares de un array y comprimir el array
« en: 24 Enero 2015, 23:01 »

hola¡¡¡ necesito ayuda urgente, tengo que diseñar un programa que me elimine las posiciones pares de un array y comprimir el mismo, tras varias horas intentandolo no he sido capaz de hacerlo... acepto cualquier ayuda que puedan darme, gracias

a continuacion pongo lo que hice hasta el momento:

Código
  1. void eliminaPares(){
  2.      int tamanho=vector.length;
  3.      for(int i=0;i<vector.length;i++){
  4.         if(i%2==1){
  5.            for (int j=i;j<vector.length;j++)
  6.               vector[j]=vector[j+1];
  7.         }
  8.      }
  9.   }

Mod: Codigo modificado, usa etiquetas GeSHi


« Última modificación: 24 Enero 2015, 23:34 por engel lex » En línea

Usuario Invitado


Desconectado Desconectado

Mensajes: 625



Ver Perfil
Re: Eliminar las posiciones pares de un array y comprimir el array
« Respuesta #1 en: 24 Enero 2015, 23:25 »

Un array es una tipo de dato con un tamaño fijo, es decir, es estático. Una vez que le das un tamaño al array, ya no puede cambiar, por lo que no es posible remover posiciones como en otros lenguajes. Con objetos tipo List (y por ende las clases que lo implementan) si es posible.

Lo que puedes hacer es crear otro array y guardar allí los datos que estén en los índices impares:

Código
  1. int oddCount = (int) array.length / 2; // cuenta los indices impares
  2.  
  3. int[] otherArray = new int[oddCount];
  4. for(byte i=0; i<oddCount; i++)
  5. {
  6. if(i % 2 != 0) // solo indices impares
  7. otherArray = array[i];
  8. }

Otra opción es convertirlo a lista y luego convertirlo nuevamente a array (tienes que trabajar con los Wrappers):
Código
  1. Integer[] array = {2,7,4,9,8};
  2. Arrays.asList(array);
  3.  
  4. for(byte i=0; i<array.size(); i++)
  5. {
  6. if(i % 2 == 0)
  7. array.remove(i);
  8. }
  9. Integer[] otherArray = array.toArray(new Integer[array.size()]);


« Última modificación: 24 Enero 2015, 23:27 por Gus Garsaky » En línea

"La vida es muy peligrosa. No por las personas que hacen el mal, si no por las que se sientan a ver lo que pasa." Albert Einstein
sevedeboa

Desconectado Desconectado

Mensajes: 5


Ver Perfil
Re: Eliminar las posiciones pares de un array y comprimir el array
« Respuesta #2 en: 24 Enero 2015, 23:30 »

quiza me he explicado mal, lo que tengo que hacer es juntar las "letras" de contiene mi array tras eliminar las posiciones vacías, es decir, mover la posicion impar siguiente a la posicion par... es decir,si paso la  cadena
 "caminante" la cadena quedara asi: "aiat"
En línea

Usuario Invitado


Desconectado Desconectado

Mensajes: 625



Ver Perfil
Re: Eliminar las posiciones pares de un array y comprimir el array
« Respuesta #3 en: 24 Enero 2015, 23:45 »

No te entiendo.

Citar
es decir,si paso la  cadena
 "caminante" la cadena quedara asi: "aiat"

¿Quieres decir que eliminas los impares y dejas solo los pares?

a -> 2
i -> 4
a -> 6
t -> 8

¿Esa cadena "caminante" la pasas en un array? ¿de qué forma?

Citar
"letras" que contiene mi array

¿Así?

Código
  1. String[] array = {"c","a","m","i","n","a","n","t","e"};

Trata de explicar tu enunciado por partes para que se entienda qué es lo que pretendes hacer.
En línea

"La vida es muy peligrosa. No por las personas que hacen el mal, si no por las que se sientan a ver lo que pasa." Albert Einstein
sevedeboa

Desconectado Desconectado

Mensajes: 5


Ver Perfil
Re: Eliminar las posiciones pares de un array y comprimir el array
« Respuesta #4 en: 25 Enero 2015, 00:08 »

este es el total de mi codigo, un metodo para recoger una cadena pasada por teclado, otra para mostrarla, ahora debo hacer un nuevo metodo que elimine las posiciones pares y finalmente llamaré de nuevo al metodo mostrar...
Código
  1. public class piza208 {
  2.   private char [] vector= new char[30];
  3.  
  4.   void recolleCadena() throws IOException{
  5.      char letra;
  6.      int i;
  7.       //System.out.println("Introduce cadea:");
  8.      letra= (char)System.in.read();
  9.      i=0;
  10.      while (letra!= '\r'){
  11.         vector[i]=letra;
  12.         letra= (char)System.in.read();
  13.         i++;
  14.      }
  15.   }
  16.  
  17.   void amosaCadena(){
  18.      int i;
  19.  
  20.      i=0;
  21.      while(vector[i]!='\0'){
  22.         System.out.print(vector[i]);
  23.         i++;
  24.      }
  25.   }
  26.  
  27.   void eliminaPares(){
  28.      int i=0;
  29.      int j=0;
  30.  
  31.         for( i=0;i<vector.length;i++){
  32.            if(i%2==1){
  33.               for (j=i;vector[i]!='\0'&&j<vector.length;j++)
  34.                  vector[j]=vector[j+1];                  
  35.            }
  36.            vector[i]=vector[j];
  37.  
  38.      }
  39.   }
  40. }
« Última modificación: 25 Enero 2015, 00:22 por sevedeboa » En línea

Usuario Invitado


Desconectado Desconectado

Mensajes: 625



Ver Perfil
Re: Eliminar las posiciones pares de un array y comprimir el array
« Respuesta #5 en: 25 Enero 2015, 15:14 »

Cuando se programa se trata de mantener las cosas simples y, haciendo ésto con arrays lo estás complicando. De todos modos, te pondré dos versiones: una con arrays y otra con list.

Versión con arrays:

Código
  1. import java.io.IOException;
  2. import java.util.ArrayList;
  3. import java.util.Arrays;
  4. import java.util.Collections;
  5. import java.util.LinkedList;
  6. import java.util.List;
  7. import java.util.Scanner;
  8.  
  9. public class ArrayDemo {
  10.  
  11. private Character[] letters  = new Character[30];
  12. private Scanner reader = new Scanner(System.in);
  13.  
  14. /*
  15. * Realiza un do while para ingresar datos
  16. * hasta que se ingrese el centinela (0) lo cual
  17. * indica que ya no se ingresaran m&#225;s n&#250;meros
  18. */
  19. void fillArray() throws IOException {
  20.  
  21. byte i = 0;
  22. char letter;
  23.  
  24. do {
  25. System.out.println("Introduce una letra o 0 para finalizar:");
  26. letter = reader.next().charAt(0);
  27. if( letter != '0') {
  28. letters [i] = letter;
  29. i++;
  30. }
  31. } while (letter != '0');
  32. }
  33.  
  34. // imprime el array
  35. void printArray() {
  36.  
  37. System.out.println("\n**** ARRAY ******\n");
  38. for(Character letter : letters)
  39. {
  40. if(letter != null) {
  41. System.out.println(letter);
  42. }
  43. }
  44. }
  45.  
  46. /*
  47. * Convierte el arreglo "letters" a lista, en concreto LinkedList para
  48. * poder usar el m&#233;todo remove() sin necesidad de un iterator.
  49. * Luego crea una lista "oddItems" que guardara los valores impares.
  50. * Posteriormente, elimina todos los elementos NULL que tiene la lista convertida
  51. * desde "letters" ya que los elementos vac&#237;os de un array contienen NULL por defecto.
  52. *
  53. * Recorre la lista y eval&#250;a si el index actual es par (quiere decir que el &#237;ndice
  54. * normal, es un impar porque en listas y arrays se empieza a contar por 0), guarda
  55. * el elemento en la nueva lista "oddItems".
  56. * seguidamente blankeo todo el array asign&#225;ndole null a cada posici&#243;n para que al
  57. * guardar el nuevo array en "letters", &#233;ste est&#233; limpio.
  58. *
  59. * Finalmente guardo el array "oddItems" en "letters".
  60. */
  61. void deleteEvensIndex() {
  62.  
  63. List<Character> tempLetters = new LinkedList<Character> (Arrays.asList(letters));
  64. List<Character> oddItems = new ArrayList<>();
  65. tempLetters.removeAll(Collections.singleton(null));
  66.  
  67. for(int i=0; i<tempLetters.size(); i++)
  68. {
  69. if ( i % 2 == 0)
  70. oddItems.add(tempLetters.get(i));
  71. letters[i] = null;
  72. }
  73. letters = oddItems.toArray(letters);
  74. }
  75.  
  76. }

Código
  1. import java.io.IOException;
  2.  
  3. public class ArrayDemoTest {
  4.  
  5. public static void main(String[] args) {
  6.  
  7. ArrayDemo obj = new ArrayDemo();
  8. try {
  9. obj.fillArray();
  10. obj.printArray();
  11. obj.deleteEvensIndex();
  12. obj.printArray();
  13. } catch (IOException e) {
  14. e.printStackTrace();
  15. }
  16.  
  17. }
  18.  
  19. }

Versión con List:

Código
  1. import java.util.ArrayList;
  2. import java.util.List;
  3. import java.util.Scanner;
  4.  
  5. public class ListDemo {
  6.  
  7. private List<Character> letters;
  8. private Scanner reader;
  9.  
  10. public ListDemo()
  11. {
  12. letters = new ArrayList<>();
  13. reader = new Scanner(System.in);
  14. }
  15.  
  16. /*
  17. * Realiza un do while para ingresar datos
  18. * hasta que se ingrese el centinela (0) lo cual
  19. * indica que ya no se ingresaran m&#225;s n&#250;meros
  20. */
  21. public void fillList()
  22. {
  23. char letter;
  24.  
  25. do {
  26. System.out.println("Introduce una letra o 0 para finalizar:");
  27. letter = reader.next().charAt(0);
  28. if( letter != '0') {
  29. letters.add(letter);
  30. }
  31. } while (letter != '0');
  32. }
  33.  
  34. /*
  35. * Convierte el arreglo "letters" a lista, en concreto LinkedList para
  36. * poder usar el m&#233;todo remove() sin necesidad de un iterator.
  37. * Luego crea una lista "oddItems" que guardara los valores impares.
  38. * Posteriormente, elimina todos los elementos NULL que tiene la lista convertida
  39. * desde "letters" ya que los elementos vac&#237;os de un array contienen NULL por defecto.
  40. *
  41. * Recorre la lista y eval&#250;a si el index actual es par (quiere decir que el &#237;ndice
  42. * normal, es un impar porque en listas y arrays se empieza a contar por 0), guarda
  43. * el elemento en la nueva lista "oddItems".
  44. *
  45. * Finalmente guardo el array "oddItems" en "letters".
  46. */
  47. public void deleteEvensIndex()
  48. {
  49. List<Character> oddItems = new ArrayList<>();
  50. for(int i=0; i<letters.size(); i++)
  51. {
  52. if(i % 2 == 0)
  53. oddItems.add(letters.get(i));
  54. }
  55. letters = oddItems;
  56. }
  57.  
  58. // imprime la lista
  59. public void printList()
  60. {
  61. System.out.println("\n ******** DATA OF LIST ******** \n");
  62. for(char c : letters)
  63. {
  64. System.out.println(c);
  65. }
  66. }
  67.  
  68. }

Código
  1. public class ListDemoTest {
  2.  
  3. public static void main(String[] args) {
  4.  
  5. ListDemo ld = new ListDemo();
  6. ld.fillList();
  7. ld.printList();
  8. ld.deleteEvensIndex();
  9. ld.printList();
  10.  
  11. }
  12.  
  13. }

Salida:

Código:
Introduce una letra o 0 para finalizar:
c
Introduce una letra o 0 para finalizar:
a
Introduce una letra o 0 para finalizar:
m
Introduce una letra o 0 para finalizar:
i
Introduce una letra o 0 para finalizar:
n
Introduce una letra o 0 para finalizar:
a
Introduce una letra o 0 para finalizar:
n
Introduce una letra o 0 para finalizar:
t
Introduce una letra o 0 para finalizar:
e
Introduce una letra o 0 para finalizar:
0

 ******** DATA OF LIST ********

c
a
m
i
n
a
n
t
e

 ******** DATA OF LIST ********

c
m
n
n
e

Si quieres que salga "aiat":

Código
  1. if(i % 2 == 0) // remplaza por
  2. if(i % 2 != 0)
« Última modificación: 25 Enero 2015, 15:54 por Gus Garsaky » En línea

"La vida es muy peligrosa. No por las personas que hacen el mal, si no por las que se sientan a ver lo que pasa." Albert Einstein
sevedeboa

Desconectado Desconectado

Mensajes: 5


Ver Perfil
Re: Eliminar las posiciones pares de un array y comprimir el array
« Respuesta #6 en: 25 Enero 2015, 20:09 »

muchas gracias por tu solucion, pero me temo que es demasiado complejo para lo que me piden, ya que se me exije hacerlo tal y como tengo en mi codigo... se que quiza no sea lo optimo, pero no puedo hacerlo tal y como me propones.... me resignaré a intentar apañarme probando de nuevo con los recorridos de los bucles a ver si logro algo..... de nuevo mil gracias por tus molestias  ;D ;D ;D
En línea

Usuario Invitado


Desconectado Desconectado

Mensajes: 625



Ver Perfil
Re: Eliminar las posiciones pares de un array y comprimir el array
« Respuesta #7 en: 25 Enero 2015, 20:37 »

No es complejo para nada, tan solo usas clases de la API de Java, totalmente estándar.

Lo que si tienes que tener en cuenta es que por más que intentes una vez que has definido el tamaño del array no podrás eliminar índices ni modificar dinámicamente el array. Como mucho podrás asignarle NULL a los índices pares.

Te recomiendo que sigas intentando hasta que consigas hacerlo a tu manera. Éste es el objetivo de los cursos de algoritmos, agilizar la lógica mental. Cuando lo logres, puedes colocar el código por si le sirve a otra persona.

Saludos.
En línea

"La vida es muy peligrosa. No por las personas que hacen el mal, si no por las que se sientan a ver lo que pasa." Albert Einstein
sevedeboa

Desconectado Desconectado

Mensajes: 5


Ver Perfil
Re: Eliminar las posiciones pares de un array y comprimir el array
« Respuesta #8 en: 26 Enero 2015, 15:52 »

finalmente he conseguido hacer lo que me pedia el profesor, dejo aqui el codigo por si a alguien le pudiese servir....
Código
  1. import java.io.IOException;
  2.  
  3. /**
  4.  *
  5.  * @author seve
  6.  */
  7. public class piza208 {
  8.   private char [] vector= new char[30];
  9.  
  10.   void recolleCadena() throws IOException{
  11.      char letra;
  12.      int i;
  13.       //System.out.println("Introduce cadea:");
  14.      letra= (char)System.in.read();
  15.      i=0;
  16.      while (letra!= '\r'){
  17.         vector[i]=letra;
  18.         letra= (char)System.in.read();
  19.         i++;
  20.      }
  21.   }
  22.  
  23.   void amosaCadena(){
  24.      int i;
  25.  
  26.      i=0;
  27.      while(vector[i]!='\0'){
  28.         System.out.print(vector[i]);
  29.         i++;
  30.      }
  31.   }
  32.  
  33.   void eliminaPares(){
  34.      int i;
  35.      int j;
  36.      i=0;
  37.      j=0;
  38.      while(vector[i]!='\0'){
  39.  
  40.         if(i%2!=0){
  41.            vector[j]=vector[i];
  42.            j++;
  43.         }
  44.         vector[i]='\0';
  45.         i++;
  46.      }
  47.   }
  48. }
  49.  
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines