Autor
|
Tema: Eliminar las posiciones pares de un array y comprimir el array (Leído 15,397 veces)
|
sevedeboa
Desconectado
Mensajes: 5
|
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: void eliminaPares(){ int tamanho=vector.length; for(int i=0;i<vector.length;i++){ if(i%2==1){ for (int j=i;j<vector.length;j++) vector[j]=vector[j+1]; } } }
Mod: Codigo modificado, usa etiquetas GeSHi
|
|
« Última modificación: 24 Enero 2015, 23:34 pm por engel lex »
|
En línea
|
|
|
|
Usuario Invitado
Desconectado
Mensajes: 625
|
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: int oddCount = (int) array.length / 2; // cuenta los indices impares int[] otherArray = new int[oddCount]; for(byte i=0; i<oddCount; i++) { if(i % 2 != 0) // solo indices impares otherArray = array[i]; }
Otra opción es convertirlo a lista y luego convertirlo nuevamente a array (tienes que trabajar con los Wrappers): for(byte i=0; i<array.size(); i++) { if(i % 2 == 0) array.remove(i); }
|
|
« Última modificación: 24 Enero 2015, 23:27 pm 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
Mensajes: 5
|
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
Mensajes: 625
|
No te entiendo. 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? "letras" que contiene mi array ¿Así? 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
Mensajes: 5
|
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... public class piza208 { private char [] vector= new char[30]; char letra; int i; //System.out.println("Introduce cadea:"); letra = (char)System. in. read(); i=0; while (letra!= '\r'){ vector[i]=letra; letra = (char)System. in. read(); i++; } } void amosaCadena(){ int i; i=0; while(vector[i]!='\0'){ i++; } } void eliminaPares(){ int i=0; int j=0; for( i=0;i<vector.length;i++){ if(i%2==1){ for (j=i;vector[i]!='\0'&&j<vector.length;j++) vector[j]=vector[j+1]; } vector[i]=vector[j]; } } }
|
|
« Última modificación: 25 Enero 2015, 00:22 am por sevedeboa »
|
En línea
|
|
|
|
Usuario Invitado
Desconectado
Mensajes: 625
|
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:import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.LinkedList; import java.util.List; import java.util.Scanner; public class ArrayDemo { private Scanner reader = new Scanner (System. in); /* * Realiza un do while para ingresar datos * hasta que se ingrese el centinela (0) lo cual * indica que ya no se ingresaran más números */ byte i = 0; char letter; do { System. out. println("Introduce una letra o 0 para finalizar:"); letter = reader.next().charAt(0); if( letter != '0') { letters [i] = letter; i++; } } while (letter != '0'); } // imprime el array void printArray() { System. out. println("\n**** ARRAY ******\n"); { if(letter != null) { } } } /* * Convierte el arreglo "letters" a lista, en concreto LinkedList para * poder usar el método remove() sin necesidad de un iterator. * Luego crea una lista "oddItems" que guardara los valores impares. * Posteriormente, elimina todos los elementos NULL que tiene la lista convertida * desde "letters" ya que los elementos vacíos de un array contienen NULL por defecto. * * Recorre la lista y evalúa si el index actual es par (quiere decir que el índice * normal, es un impar porque en listas y arrays se empieza a contar por 0), guarda * el elemento en la nueva lista "oddItems". * seguidamente blankeo todo el array asignándole null a cada posición para que al * guardar el nuevo array en "letters", éste esté limpio. * * Finalmente guardo el array "oddItems" en "letters". */ void deleteEvensIndex() { List <Character > tempLetters = new LinkedList <Character > (Arrays. asList(letters )); List<Character> oddItems = new ArrayList<>(); for(int i=0; i<tempLetters.size(); i++) { if ( i % 2 == 0) oddItems.add(tempLetters.get(i)); letters[i] = null; } letters = oddItems.toArray(letters); } }
import java.io.IOException; public class ArrayDemoTest { public static void main (String[] args ) { ArrayDemo obj = new ArrayDemo(); try { obj.fillArray(); obj.printArray(); obj.deleteEvensIndex(); obj.printArray(); e.printStackTrace(); } } }
Versión con List:import java.util.ArrayList; import java.util.List; import java.util.Scanner; public class ListDemo { private List<Character> letters; private Scanner reader; public ListDemo() { letters = new ArrayList<>(); reader = new Scanner (System. in); } /* * Realiza un do while para ingresar datos * hasta que se ingrese el centinela (0) lo cual * indica que ya no se ingresaran más números */ public void fillList() { char letter; do { System. out. println("Introduce una letra o 0 para finalizar:"); letter = reader.next().charAt(0); if( letter != '0') { letters.add(letter); } } while (letter != '0'); } /* * Convierte el arreglo "letters" a lista, en concreto LinkedList para * poder usar el método remove() sin necesidad de un iterator. * Luego crea una lista "oddItems" que guardara los valores impares. * Posteriormente, elimina todos los elementos NULL que tiene la lista convertida * desde "letters" ya que los elementos vacíos de un array contienen NULL por defecto. * * Recorre la lista y evalúa si el index actual es par (quiere decir que el índice * normal, es un impar porque en listas y arrays se empieza a contar por 0), guarda * el elemento en la nueva lista "oddItems". * * Finalmente guardo el array "oddItems" en "letters". */ public void deleteEvensIndex() { List<Character> oddItems = new ArrayList<>(); for(int i=0; i<letters.size(); i++) { if(i % 2 == 0) oddItems.add(letters.get(i)); } letters = oddItems; } // imprime la lista public void printList() { System. out. println("\n ******** DATA OF LIST ******** \n"); for(char c : letters) { } } }
public class ListDemoTest { public static void main (String[] args ) { ListDemo ld = new ListDemo(); ld.fillList(); ld.printList(); ld.deleteEvensIndex(); ld.printList(); } }
Salida: 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": if(i % 2 == 0) // remplaza por if(i % 2 != 0)
|
|
« Última modificación: 25 Enero 2015, 15:54 pm 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
|
|
|
|
Usuario Invitado
Desconectado
Mensajes: 625
|
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
Mensajes: 5
|
finalmente he conseguido hacer lo que me pedia el profesor, dejo aqui el codigo por si a alguien le pudiese servir.... import java.io.IOException; /** * * @author seve */ public class piza208 { private char [] vector= new char[30]; char letra; int i; //System.out.println("Introduce cadea:"); letra = (char)System. in. read(); i=0; while (letra!= '\r'){ vector[i]=letra; letra = (char)System. in. read(); i++; } } void amosaCadena(){ int i; i=0; while(vector[i]!='\0'){ i++; } } void eliminaPares(){ int i; int j; i=0; j=0; while(vector[i]!='\0'){ if(i%2!=0){ vector[j]=vector[i]; j++; } vector[i]='\0'; i++; } } }
|
|
|
En línea
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
Copiar parte de una array a otra array
Programación Visual Basic
|
sircid
|
3
|
5,254
|
19 Diciembre 2007, 11:27 am
por LeandroA
|
|
|
Eliminar un elemento en un Array
Programación Visual Basic
|
edgar_allan
|
4
|
36,971
|
16 Enero 2009, 02:17 am
por LeandroA
|
|
|
Eliminar Elementos repetidos en un array
Programación C/C++
|
maikelowen
|
6
|
7,690
|
8 Enero 2015, 10:21 am
por Orubatosu
|
|
|
array y limite de array sobrepasado...
Programación C/C++
|
bash
|
3
|
2,748
|
31 Enero 2017, 22:15 pm
por MAFUS
|
|
|
Asignar a un array, la mitad o una parte de otro array
Programación C/C++
|
etcheverrypablol
|
2
|
2,717
|
25 Marzo 2017, 16:05 pm
por etcheverrypablol
|
|