El Post Oficial para aprender Java

willy_chaos

A ver que os parece lo que hemos realizado de practica para la universidad.

MVC a pelo, sin frameworks

3
FoxWinterMan

Hola!

Tengo que insertar una imagen a cada objeto que cree, de manera que cuando quiera consultar el objeto se me abra una ventana mostrando los datos del objeto+imagen, y mi duda surge porque nose que atributo tengo que ponerle en la clase para luego poder agregar la imagen al crear dicho objeto.

Lo que habia pensado era ponerle un ImageIcon y poner todas las fotos necesarias en mi proyecto principal, pero nose si va ser la mejor idea para manejarlo despues!

Al iniciar la aplicacion, tiene que salir 2 botones, uno para registrarse y otro para logear, hay 2 tipos de usuarios, administrador y cliente.

El cliente imagino que va ser un objeto de clase Persona/Cliente y los voy almacenando en un ArrayList o hashmap, mi pregunta es como hago para crear un administrador que sepa que tiene unos derechos diferentes a los de usuario, todo a bse de sentencias de control?

1 respuesta
willy_chaos

Por si te sirve http://www.driverlandia.com/java-anadir-imagen-de-fondo-a-jpanel/

es para un JPanel pero es mas o menos lo mismo. Yo lo que hice en la aplicacion que ves encima es darle al boton ya su atributo imagen y


private Image img_objeto;


public void setImage(String imgPath) {

this.img_objeto = new ImageIcon(imgPath).getImage();

}

Spacelord

#152 Lo de los clientes/administradores: si sólo tienes dos tipos de user, yo de ti creaba un boolean isAdmin, o algo así, y le daba valor true si el login corresponde con el de un admin y false si es un cliente. Luego, cuando crees el JFrame principal, pasas por parámetro el boolean al constructor de la ventana. Si es false, pintará unas opciones. Si es true, pintará otras. Incluso puedes poner un atributo isAdmin en el JFrame y darle valor para consultarlo cada vez que el usuario quiera hacer algo, a ver si puede o no.

Se puede hacer con objetos, pero es un coñazo innecesario: haz un objeto de la clase Usuario y dos subclases, Cliente y Administrador, y en vez de pasar el boolean pasas la referencia al objeto que se crea al loguear dependiendo de las credenciales introducidas.

6 meses después
Martita-

Refloto esto para no crear un post nuevo.

Estoy haciendo un metodo set en la clase Modulo, y necesito saber el expediente de un alumno que esta en la clase Alumno para meterlo en un hashmap junto con otro dato.

Esto es lo que tengo, pero me da error. Que igual estoy haciendo una burrada, pero hemos empezado con las clases ahora.

(Codigo es el codigo del modulo)

    public void Matricular(Alumno a, String codigo){        
matriculados.put(a.getExpediente(), codigo); }

Me da error concretamente en a.getExpediente(). Diciendome que no puede convertir int a Alumno, o algo asi.

1 respuesta
Foxtreme

#155 si no das más detalles lo único que puedo decirte es lo mismo: estás tratando de usar un tipo de dato entero donde deberías usar un tipo 'Alumno'.

1 respuesta
Martita-

#156

Basicamente quiero extraer el expediente del alumno, para meterlo ahi, y que el expediente sea la clave del hashmap que he creado.

1 respuesta
Fyn4r

Habria que ver como esta definido expediente y el hashmap, y podrias ser mas especifica con el error xd

1 respuesta
Lecherito

#157 Pon el código entero, no te lo vamos a robar

1 respuesta
Martita-

#158

Esque el error dice eso simplemente, int cannot be converted to Alumno.

#159 Wtf, es un ejercicio de clase sin mas, no tengo miedo a que lo robeis.

    public int getExpediente(){
        return expediente;
    }
Map<Alumno, String> matriculados = new HashMap<>();
    public void Matricular(Alumno a, String codigo){     
matriculados.put(a.getExpediente(), codigo); }
2 respuestas
Gif

#160 en el HashMap<> que tienes entre <>?

no tendrás HashMap<Alumno,String> ?

edit: ok, tienes que cambiar el Alumno de HashMap<Alumno,String> por HashMap<int,String>

1 respuesta
Lecherito

#160 El mapa lo defines como Alumno y le quieres meter un int.

Martita-

#161

Si, lo tengo como Alumno, String.

Pero esque pienso que Alumno como "clave" en el hashmap no es una buena clave, ya que guarda otros atributos ademas del expediente, quizas deberia poner solo el expediente?

3 respuestas
Gif

#163 en tal caso seria HashMap<( código identificativo del alumno),Expediente>

Foxtreme

#163

Necesitas hacer coincidir los tipos de datos que guardas con el tipo aceptado por el HashMap. En un HashMap de tipo Alumno solo puedes guardar ese tipo de dato; Si lo que intentas guardar son enteros (deduzco por el error que el valor devuelto por getExpediente() es un int), cambia el HashMap a tipo Integer:

Map<Integer, String> matriculados = new HashMap<Integer, String>();

#166 no he tocado nada de java 8, de hecho no toco java desde el curso pasado xD

1 respuesta
MTX_Anubis

#163 Si el expediente es una clave única del alumno (que debería serlo) pues puedes dejarlo así pero dependiendo de cómo esté hecha la aplicación y para qué lo uses, tendrás que tener el otro sitio alguna forma de sacar el alumno mediante su expediente (por ejemplo mediante otro map relacionando expediente-alumno para que sea más rápido).

Vamos yo lo haría así pero porque no sé pensar de otra forma que no sean claves primarias salvo cosas concretas xD

#165 En java8 (que doy por hecho que es lo que está usando) se infiere el tipo del hashmap por la declaración, vamos que con poner esto le valdría

Map<Integer, String> matriculados = new HashMap<>();
5 meses después
re4q

Hola, vengo a ver si podéis ayudarme con un ejercicio muy simple que no logro resolver.
A partir de un vector de n elementos y un indice, tengo que crear otro vector con los mismos números pero sin el elemento que hay en el indice pasado por parámetro, es decir, el nuevo vector siempre sera de n-1 de longitud que el original.

Tengo esto:

public double[] vectorWithoutelement(double[] v, int p) {
    double[] vectorResultant = new double[v.length-1];
    p = p-1; //para igualarlo al correspondiente indice para array
    for (int i = 0; i <= v.length-1; i++){
      if (i != p){
        vectorResultant[i] = v[i];
      } else {
        vectorResultant[i] = v[i+1];
        i++;
      }
    }
    System.out.println(vectorResultant.toString());
    return vectorResultant;
  }

Evidentemente este código solo me funciona si le paso por parámetro el indice 4 ya que de al pasarle uno distinto me dice que se fue del array.
He probado ya de muchas formas, algunas donde el indice que me marca el usuario convierte el elemento en 0.

Edit: No puedo usar bibliotecas

1 respuesta
Lecherito

#167 Haz el bucle haciendo vectorResultant = v[ i] pero saltándote cuando p == i

1 respuesta
re4q

#168 claro, la cuestión es que no sé exactamente que hacer cuando p==1, es decir no tengo que meterlo en el array, pero me pone 0 por defecto.

1 respuesta
Lecherito

#169

for (recorre array) {
if (i != p) {
nuevo[ i ] = viejo[ i ];
}
}
1 respuesta
re4q

#170 si, esto ya lo probé y no funciona, como ya te digo cuando detecta ese i==p pone un 0 como valor. No se lo salta sin mas.

Gracias de todas formas

Aquí el resultado

double[] v= {1,2,3,4,5,6,7,8};
p.vectorWithoutelement(v,2)
[D@403ea216
{ 1.0, 0.0, 3.0, 4.0, 5.0, 6.0, 7.0 }
p.vectorWithoutelement(v,5)
[D@1aec80f4
{ 1.0, 2.0, 3.0, 4.0, 0.0, 6.0, 7.0 }
1 respuesta
Lecherito

#171 No, cuando detecta eso no hace nada.

2 respuestas
re4q

#172 mira, como puedes comprobar, pone un 0 y como el array tiene -1 de longitud que la original no llega al 8

2 respuestas
Lecherito

#173

public static void main(String[] args) {
        Double[] viejo = { 1.0, 2.0, 3.0, 4.0 };
        Double[] nuevo = new Double[viejo.length-1];
        int borrar = 2, passed = 0;
        for (int i=0; i<viejo.length; i++) {
            if (i != borrar) {
                nuevo[ i - passed ] = viejo[ i ];
            } else {
                passed = 1;
            }
        }
        System.out.println(Arrays.deepToString(nuevo));
    }
1 respuesta
jalamoNNN

#172 puedes usar dos índices a modo de iterador, uno para recorrer tu vector original y otro para el nuevo vector. De esta manera, haces un bucle en el que compruebas si el índice no es el que buscas, en cuyo caso lo copias al vector resultante. Si por el contrario es el índice que buscas, entonces aumentas en uno el índice que usas para recorrerte el vector original y no copias el dato al vector resultante.
Es una de las muchas formas que se puede hacer.

Ranthas

#173 No puedes tener un array de por ejemplo, 4 posiciones, y dejar 2 de ellas vacías.

Array de longitud 4: [0,1,2,4] -> válido
Array de longitud 4: [0, null, 2, 4] -> no válido

Cuando llegas a la posición que has de excluir, no puedes "no hacer nada", ya que esa posición debe ser ocupada por un integer en este caso, sí o sí.

Cuando llegas a esa posición (i), debes enchufarle el elemento que está en i+1 en el array original.

Te inserto el código, aunque sería mejor que lo hicieras por tu cuenta y después comparases.

import java.util.Arrays;

public class Prueba {
	
public static void main(String args[]) {
	
	int[] source = new int[] {1, 2, 3, 4, 5, 6, 7, 8, 9, 0};
	int[] destiny = new int[source.length - 1];
	int stop = 5; //Se supone que esto te llega por parámetro, es la posición "crítica"
	
	for(int i=0; i<source.length; i++) {
		
		if(i < source.length - 1)  { //Para que no te salgas por fuera del array
			
			if(i == stop) {
				destiny[i] = source[i+1];
			} else {
				destiny[i] = source[i];
			}
		}
	}
	
	System.out.println("Hola soy el array original: " + Arrays.toString(source));
	System.out.println("Hola soy el array resultado: " + Arrays.toString(destiny));

}
}

Yep, edito para decirte que los arrays empiezan por la posición 0; si lo que quieres es excluir contando desde la posición 1, puedes o bien modificar la variable stop (le restas 1), o modificas los índices de recorrido del array.

1 respuesta
re4q

Gracias a todos por la ayuda, la solución correcta es la de #174 . #176 Lo que has hecho ahí yo ya lo probé, cuando llega a la posición crítica coge el siguiente numero bien, pero luego el siguiente se repetirá, es decir, saldrá una cosa así: 1,2,3,4,5,6 si la posición critica es 2, sale 1,3,3 .....

1 respuesta
Hexar

Para mi lo más fácil sería recorrer el vector añadiendo los elementos a un arrayList y al acabar transformarlo a un array de nuevo algo así

List<Integer> lista = new ArrayList<Integer>(0);
Integer[] nuevo= new Integer[viejo.length-1];
 for (int i=0; i<viejo.length; i++) {
            if (i != borrar) {
                lista.add(viejo[ i ]);
            } else {
            }
        }
lista.toArray(nuevo);

donde el borrar seria el indice que quieres eliminar luego ya usa el metodo que quieras

1 respuesta
Lecherito

#178 Lo más fácil y one liner:
List<Double> nuevo = Arrays.asList(arrayViejo);
nuevo.remove(i);
imprime;

B

#177

Hola, siento llegar tarde, no sé porqué no me saltaban los favoritos, la solución que te han dado está bien, pero lo suyo sería evitar los ifs sin incrementar la complejidad del algoritmo (seguiría siendo O(n)) y creo que queda más visible de la siguiente forma:

public static double[] arrayWithoutElement(double[] v, int p) {
    	
    double[] arrayNew = new double[v.length-1];
    int count = 0;
    
    while (v[count] != p ){
    	arrayNew[count]=v[count++];
    }
    
    while(count < arrayNew.length){
    	arrayNew[count] = v[count+1];
    	count++;
    }
    
    return arrayNew;
}

Basicamente vas rellenando el nuevo array con tamaño el anterior-1 hasta que encuentras el elemento, una vez lo encuentras rellenas desde esa posicion saltandote una. Evidentemente lo suyo sería comprobar con otra función, boolean, existsElement para evitar que salte una excepción de array fuera de límites.

Un saludo.

Usuarios habituales