El Post Oficial para aprender Java

re4q

#60 si, creo que tengo que hacer mas clases y devolver el resultado en cada class, es decir hacer 5 public double *** (double a, double b)

edit: RESUELTO, gracias

public class Program {

public double add(double a, double b) {
    double add= a+b;
    return add;
}
 public double subtract(double a, double b) {
    double subtract = a-b;
    return subtract;
 }
 public double multiply(double a, double b) {
    double multiply = a*b;
    return multiply;
    }
  public double divide(double a, double b) {
    double divide = a/b;
    return divide;
    }
   public double quocient(double a, double b) {  
    double quocient = a%b;
    return quocient;
    }
Habichuela

Estoy aprendiendo Java y me han pedido un ejercicio que escriba la frase almacena en un String al revés y he puesto esto y funciona:

String mundo="Hola Mundo como estás?";
int i;
int longitud;
longitud=mundo.length();

for (i=longitud-1;i>=0;i--){
  print(mundo.charAt(i));
}

Pero la verdad es que no comprendo por qué tiene que ser la i=longitud-1 si debería ser 22 las vueltas que debe dar no? que es la longitud de caracteres de "Hola Mundo como estás?"

2 respuestas
kraneok

#62 Por que un String es un array y los arrays siempre tienen una posición demás que indica el fin del array.

1 respuesta
Perurena

#62 Un string es un array de carácteres (char). Entonces, todos los arrays van desde la posición 0 a la posición "longitud-1", ¿por qué? Porque si tu sacas la longitud de un array de 20 posiciones, te dará 20, pero en realidad las posiciones van de 0 a 19.

2 1 respuesta
Habichuela

#64 #63 Cierto, me acuerdo ahora que el profesor me había dicho que usando el charAt las posiciones empezaban desde 0! gracias, creo que voy a usar este thread a menudo xDD

1 respuesta
TeRRo90

#65 Te recomiendo que primero busques en Stackverflow y si sigues teniendo dudas postealo aquí ya que cosas tan básicas como esa la puedes encontrar facilmente.

3
2 meses después
re4q

hola de nuevo, veo que este hilo lleva bastante tiempo muerto. Tengo una duda, quiero pasar una array de 2d a una de 1d. Esto es lo que tengo:

public int[] matrix2vector(int[][] matrix) {


    int[]array = new int [matrix.length*matrix[0].length];
    
    for (int i = 0; i < array.length; i++){
      for (int j = 0; j < matrix.length; j++){
         for (int z = 0; z < matrix[0].length; z++){
           
           array[i] = matrix[j][z];
            
         }
      }
    }
    
   return array;   
}
}

El problema es que me devuelve siempre el ultimo valor. Por ejemplo si el usuario pone la siguiente array: int[][] matrix = {{1,2,3},{4,5,6},{7,8,9}};

me devolvera: {9,9,9,9,9,9,9,9,9};

no se como arreglarlo.

1 respuesta
benjajim

#67 Usa una lista intermedia para convertir:

public int[] matrix2vector(int[][] matrix) {
    List<E> listaTemp = new ArrayList<E>();
    for (int i = 0; i < matrix.length; i++) {
        for (int j = 0; j < matrix[i].length; j++) { 
            listaTemp.add(matrix[i][j]); 
        }
    }

int[] array = new int[listaTemp .size()];
for (int i = 0; i < array.length; i++) {
    array [i] = listaTemp.get(i);
}
}

Creo que funciona pero no lo he probado, hazlo y me cuentas.

1 respuesta
re4q

#68 si, esto de las listas lo he visto por internet, el problema es que aun no nos han enseñado a usar esto por lo que no puedo usarlo para resolver el problema.
Gracias de todos modos, me estoy comiendo mucho la cabeza con esto que en principio parace muy sencillo.

benjajim
public int[] matrix2vector(int[][] matrix) {


    int[]array = new int [matrix.length*matrix[0].length];
    int i = 0;

      for (int j = 0; j < matrix.length; j++){
         for (int z = 0; z < matrix[0].length; z++){
           
           array[i] = matrix[j][z];
           i++;
         }
      }

    
   return array;   
}

A ver asi.

1 respuesta
re4q

#70 crack ! gracias

Perkele

Buenas, ando estudiando java en el DAW y me he topado con lo siguiente, llevo un buen rato intentando encontrar el error con el debugger pero no veo nada :( A ver si me podéis echar una mano. Explico el programa brevemente:

Se da esa frase en el string t y la idea es meter cada palabra en una posicion del array llamando al método existePalabra para comprobar si la palabra ya está en el array, en ese caso no se mete. La idea de todo esto es hacer luego un conteo de cuantas repeticiones por palabra hay en el string dado... pero no paso de meter las palabras.

El error pasandolo por el debugger es el for que hace el conteo de los tokens. A la 6º vuelta vuelve a 0 y se va cargando las palabras ya escritas. El ejemplo de salida del array sería este:

[El],[euro],[está],[más],[alto],[que] Aquí debería ir el resto de la frase pero lo que hace en realidad es sobreescribir la posicion 0 del array en cada vuelta por el siguiente token...

De verdad parece ser una tontería pero no doy con ello. Le preguntaría al profesor pero no le veo hasta el lunes y quiero dar con la dichosa solución.

Muchisimas gracias al que me ayude


package Tokenizer;

import java.util.StringTokenizer;

public class Ejercicio1 {

public static void main(String[] args) {

	String t = "El euro está más alto que el dólar. El dólar está barato.";
	String[] palarray = new String[12];

	StringTokenizer st = new StringTokenizer(t, " .");
	System.out.println(st.countTokens() + " palabras");

	while (st.hasMoreTokens()) {

		for (int i = 0; i < st.countTokens(); i++) {
			String p = st.nextToken();
			if (!existePalabra(palarray, p)) { 
												
												
				palarray[i] = p;
			}

		}

	}

}






private static boolean existePalabra(String[] palarray, String p) {

	for (int i = 0; i < palarray.length; i++) {

		if (palarray[i] != null) {
			if (palarray[i].equals(p)) { 
											
				return true; }
			else {
				continue;
			}
		}
	}
	
	return false;

}
}

2 respuestas
Dostoievski

#72 http://docs.oracle.com/javase/7/docs/api/java/util/StringTokenizer.html

countTokens
public int countTokens()
Calculates the number of times that this tokenizer's nextToken method can be called before it generates an exception. The current position is not advanced.
Returns:
the number of tokens remaining in the string using the current delimiter set.
See Also:
nextToken()

countTokens te devuelve el numero de palabras actual, vamos que cada vez que llamas a nextToken, countToken te devolverá 1 menos y sin embargo tu I se aumenta así que llegara un momento en el que nextToken sea 6 y tu I sea 6 y se saldrá del for, volverá al bucle while y como tiene más tokens volverá a entrar en el for, reseteando el valor de I a 0.

haz esto:

int count = 0;
String[] wordArray = new String[st.countTokens()];
String word;
while (st.hasMoreTokens()) {
  word = st.nextToken();
  if (!existePalabra(wordArray,word)) { 
    palarray[count] = p;
    count++;
  }

}

Y si lo hicieras con listas pues mucho mejor :P

2 respuestas
Lecherito

#72 Otro aviso es: StringTokenizer is a legacy class that is retained for compatibility reasons although its use is discouraged in new code. It is recommended that anyone seeking this functionality use the split method of String or the java.util.regex package instead.

Estás usando 2 bucles y solo quieres iterar el StringTokenizer por lo que algo hay mal por ahí, o usas el countTokens y un contador, o usas el hasMoreTokens hasta que no haya más.

Respecto al existePalabra(), no hace falta ese else { continue; } ya que es lo que va a hacer si no encuentra más código, ir a la siguiente iteración del bucle.

Como otro consejo que te ha dado #73 es usar Listas (ArrayList<String> por ejemplo), si no te lo "han enseñado me callo, pero te haría la vida mucho más fácil!

1 respuesta
Perkele

#73 #74 Muchísimas gracias! La verdad es que si que hemos dado los array list (hicimos un generador de boletos de primitiva) pero no nos quedó muy clara la cosa y se quedó en el limbo para más adelante. Os referís a aplicar la palabra frente al numero de repeticiones de ésta en un array list? Yo tenía pensado hacerlo en dos arrays diferentes, uno que manejase las palabras y el otro las repeticiones, creo que no sabría plantearlo con el array list... aun así me habéis ayudado mucho :qq:

1 respuesta
Lecherito

#75 Un ArrayList viene a ser un array que crece dinámicamente, no le das un tamaño fijo y de ahí no cambia. Además tiene métodos como el contains(); que te dice si contiene un elemento ya dentro por lo que incluso te ahorras tu segundo método.

Con un simple split y un bucle recorriendo ese array lo deberías de tener.

1 mes después
FoxWinterMan

Hola buenas tengo un ejercicio muy básico de arrays que no consigo encontrar solucion:
Escribir un programa que genere 100 números enteros aleatorios entre el 1 y el 500, los almacene en un array, los ordene y a continuación genere un array de caracteres que contenga una ‘p’ en las posiciones donde hay números pares y una ‘i’ en los impares. Mostrar el contenido de ambos arrays en filas de 10 elementos formados por pares de número y letra.

Lo unic que me falta es imprimir por pantalla la table de esta manera, me han dicho de hacer un contador o un bucle anidado pero no me sale de manera que sea un cuadrado 10x10 perfecto.

import java.io.*;
import java.util.*;

public class array1 {

/**
 * @param args the command line arguments
 */
public static void main(String[] args) {
    // Escribir un programa que genere 100 números enteros aleatorios entre el 1 y el 500,
    //los almacene en un array, los ordene y a continuación genere un array de caracteres
    //que contenga una ‘p’ en las posiciones donde hay números pares y una ‘i’ en los impares.
    //Mostrar el contenido de ambos arrays en filas de 10 elementos formados por pares de número y letra.
    
    Scanner input = new Scanner(System.in);
    int i;
    int aleatorio[] = new int[100];
    char pari[] = new char[100];
    Random rand = new Random();
    for(i=0;i<=99; i++){
        aleatorio[i]= rand.nextInt(501);
    }       
    Arrays.sort(aleatorio);
    
    for(i=0;i<=99; i++){
    if(aleatorio[i]%2==0)
        pari[i] = 'p';
    else
        pari[i] = 'i';
    }
    System.out.println("A continuacion se muestra la table de los numeros aleatorios:");
  
} }

AYUDA PLEASE!

1 respuesta
Spacelord

#77 Creas un bucle for de 0 a 100 (la longitud de ambos arrays) y escribes, con printf, las parejas de número y letra con el formateo que quieras. Luego pones una cláusula if que controla si el valor del contador i en una iteración dada del bucle es múltiplo de 10. Si lo es, salto de línea. Si no lo es, sigue escribiendo en la misma línea.

Más o menos así:

for (int i = 0; i<100 ; i++)
{
System.out.printf(" " + pari[i] + ", ")
System.out.printf(" " + aleatorio[i] + ", ")
if(i%10 == 0)
{
System.out.printf("\n");
}
}

Si no he entendido mal lo que quieres hacer, vamos.

Edel_Hagaren

Muy buenas, espero que me podáis ayudar con una pequeña duda:

Nos han mandado hacer un ejercicio que tiene que ver con un Mapa, y nos lo ha explicado así un poco aprisa, y no he terminado de cogerlo bien, por lo que se ve. El enunciado es el siguiente:

spoiler

Aparte del tema de la búsqueda, que con eso del par clave/valor que tiene el Mapa, no consigo hacerla como quiere.

Además de eso, lo del id único tampoco estoy seguro, recuerdo que una vez hizo algo así, un id que se asignaba en el constructor del objeto y se incrementaba, de modo que cada vez que se creaba un objeto nuevo de ese tipo le daba un id distinto y único para él.

Espero que podáis ayudarme, no paso el código porque lo único que me falla es la búsqueda y lo del identificador, pero si es necesario lo paso, aunque como digo lo que pasaría sería la declaración de los objetos y el intento de búsqueda :S

Gracias de antemano :D

1 respuesta
Lecherito

#79 La búsqueda con hacer un bucle del tipo

for (Entry<Integer, Cliente> cliente : mapa.entrySet()) {
  if (cliente.getNombre().equals("PEPITO")) {
    syso("Pepito está!"); 
  }
}

Y para la id, un atributo estático en la clase cliente, que cada vez que crees uno haga un id++ y se lo asigne a la id interna del cliente (por lo que tendrías 2, el estático [el contador] y el del cliente)

del tipo

Cliente cli = new Cliente("Pepito");
mapa.put(cli.getId(), cli);

Pero vamos, se me hace raro eso de usar el Map xD

1 respuesta
Edel_Hagaren

#80 Esa forma del for no la hemos visto nunca :O su idea es que usemos el containsValue para las búsquedas.

Ya, y a mí, si se supone que apenas lo vamos a usar, pero le ha dado por poner esto para pedírnoslo mañana :S

1 respuesta
Lecherito

#81 El containsValue no tiene mucho sentido porque:

1- Si quieres hacer búsquedas de 2 cosas diferentes tendrías que tener 2 mapas diferentes
2- Por que en sí mismo no tiene mucho sentido para buscar DENTRO del objeto, no es que quieras buscar un integer en un <String, Integer> xD

1 respuesta
Edel_Hagaren

#82 Nos ha aclarado después que al final el id viene siendo la clave del Mapa, y ha reivindicado que sí hay que usar los métodos de Mapa :S

Otra cosa que tenemos en clase todos que se nos resiste es el hecho de cómo puede el usuario elegir qué Cliente de los del Mapa quiere modificar/eliminar, pero a mí el asunto que me trae más de cabeza ahora es lo de la búsqueda con métodos de Mapa, ya que la idea para lo otro creo que la tengo.

Yo lo que no entiendo es por qué los profesores te hacen entregar ejercicios como estos, si luego te dicen a las claras que no lo usaremos nunca, pero el dolor de cabeza nos lo dan igual, que encima ayer el enunciado era distinto y no dijo nada de entregarlo, pero se ve que ha cambiado de opinión U.U

1 respuesta
Lecherito

#83 Si te fijas el código de #80, te puse que el ID sería la clave del mapa, y el cliente pues el cliente que tenga esa id (que quizá tengas que sacar el estático de la clase cliente y ponerlo en la clase principal, pero bueno, al fin y al cabo es lo mismo)

Supongo que para elegir qué modificar será mediante entrada por teclado, eso sí, ya te digo yo que el containsValue dudo que lo uses. De todas maneras dile a tu profesor que se aclare, vaya cosas más raras, lol.

1 respuesta
Edel_Hagaren

#84 Cierto, es verdad, aunque ha cambiado el hecho de que sea un atributo de Cliente, eso era lo que quería decir.

Uy, ojalá diese su brazo a torcer, pero esta mujer es imposible TT.TT es que, vamos a ver.. si lo das de pasada y dices que no lo vamos a usar nunca.. ¿para qué pones un ejercicio así, y encima con restricciones como la del containsValue? Yo cada día la entiendo menos, y el caso es que, si no fuese necesario entregar este tipo de ejercicios que pide para aprobar, no lo haría, si en los exámenes saco nota siempre, porque pregunta al menos cosas que se usan y no suele restringir.. no mucho, al menos.

Scottie

Hay alguna forma de lanzar un mensaje cuando se ejecute el destructor de un objeto o un instante previo?

2 respuestas
Spacelord

#86 En Java no hay destructor. Si te refieres a lanzar un mensaje cuando el recolector actúe, no, no se puede.

1 respuesta
Lecherito

#87 De hecho diría que si se puede

#86 http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html#finalize()
Called by the garbage collector on an object when garbage collection determines that there are no more references to the object.

Supongo que se podrá hacer metiendo un @Override a ese método del tipo

@Override
protected void finalize() {
  System.out.println("Ahhh que me borran!! "+toString());
  super.finalize();
}

Nunca lo he hecho y no sé si funciona, pero la teoría se supone que es esa.

2 respuestas
Perurena

#88 Yo tampoco lo he hecho nunca, pero tiene pinta de que es como tú lo dices.

Spacelord

#88 Ya había pensado en finalize(), pero como eso no obliga al recolector a destruir memoria por eso no le he dicho nada.

1 respuesta