Ordenacion y Busqueda

Hola a todos.

Esta es mi primera entrada en este portal y estoy estudiando Java, pero soy novato en esto. Tengo una duda espantosa, ya que no sé como hacerle para realizar esta actividad, espero y alguien me pueda apoyar, gracias.

La pregunta es esta:

Las antiguas patentes (de automóviles), por ejemplo PL7812, están compuestas por un string de dos caracteres, en el ejemplo PL, y por un número entero de cuatro dígitos, en el ejemplo 7812. Suponga que exista una clase Patente y otra TablaDePatentes de la siguiente forma:

public class Patente { private String letras ; private int numero ; public Patente () {}
public String obtLetras () { return letras ; }

public int obtNumero () { return numero ; }
}
public class TablaDePatentes {
private String [] tabla ;
public TablaDePatentes () { tabla = new String [9999]; }
public boolean buscar (Patente patente ) {}
otros métodos
}

La idea es que TablaDePatentes almacena en el atributo tabla todas las patentes autorizadas a estacionarse en el campus San Joaquín.

Lo primero que se pide es declarar el método como nos indican en el enunciado. Luego, con los métodos de la clase Patente, obtenemos las letras y los números que la componen. Con el número de la patente obtenemos lo almacenado en el arreglo y luego debemos recorrer este String obteniendo Substring de largo 2 e ir comparando cada substring con las letras de la patente a buscar. Si coincide con alguno retornamos true, de lo contrario retornamos false.

Posible solución:

public boolean buscar (Patente patente ) {
int num = patente. obtNumero ();
String letras = patente . obtLetras (); String validas = tabla [ num ];
if( validas != null ){
int largo = validas . length ();
int k = 1;
while (k < largo ) {
if ( letras . equals ( validas . substring (k - 1, k + 1)))
return true;
k = k + 2;
}
}
return false ;
}

Mi problema es que no sé que tengo que hacer, ni donde poner las cosas que se me pide, espero su apoyo.

Comentarios

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de iocio

SOLUCION

Buenas noches Gildardo, no he podido contestarte antes porque no me terminaba de dar de alta el moderador. Vamos por partes.
Los arrays (o arreglos) son un tipo de lista basico en Java donde se almacena un tipo de dato primitivo o definido por el usuario, en tu caso, en cada posicion guardaras algo de tipo Patente. Por lo tanto la definicion correcta seria algo tipo Patente[ ] listaPatentes = new Patente[9999]; (Luego te copio todo el codigo, no te preocupes). Luego es tan sencillo como iterar por toda la tabla en busca de la parte que coincida con las letras, y si es asi buscar si coincide con el numero. Si no pasar a la siguiente y en caso de coincidir, salir del bucle al tener ya la respuesta. La clase patente quedaria tal que:

public class Patente {
        private String letras;
        private int numero;

        public Patente() {
        }

        public String obtLetras() {
                return letras;
        }

        public int obtNumero() {
                return numero;
        }

}

Y la clase TablaDePatentes quedaria:

public class TablaDePatentes {
        private Patente[] tabla;

        public TablaDePatentes() {
                tabla = new Patente[9999];
        }
        /**
         * El problema de tu diseño es que los arrays (o arreglos) deben almacenar el tipo de dato que realmente quieres guardar, en tu caso un array de   Patentes  
         *
         */

        public boolean buscar(Patente patente) {
                int num = patente.obtNumero();
                String letras = patente.obtLetras();
                boolean encontrado = false;
               
                for (int i = 0; i < tabla.length && encontrado == false; i++) { //El bucle seguira iterando hasta que acabe la tabla o hasta que encontrado == true.
                        if (tabla[i].obtLetras().equals(letras)) { //Comparamos el tipo de dato String con el i-esimo String de la tabla
                                if (tabla[i].obtNumero()==num) { //Comparamos el tipo de dato entero con el i-esimo int de la tabla
                                        encontrado = true; //Al encontrarlo, encontrado == true por lo tanto sale del bucle y retorna el encontrado==true, si este caso nunca se da retornara encontrado == false;

                                }
                        }

                }
                return encontrado;
        }
}

Al comparar la cadena de caracteres utilizo el metodo .equals() porque el metodo == compara el objeto al que apunta en si, no si los caracteres son iguales. En tu caso debes usar .equals() para el string y == para el int. Si tienes cualquier duda comentame, pero no tienes porque utilizar substrings al tener los numeros y las letras en variables separadas ok??

Espero haberte ayudado,

Un saludo.

Imagen de iocio

Optimizacion de la solucion

Los dos if dentro del for los he dejado separados para que lo veas mas claro, pero podria valer igual de bien sustituyendolo por esto:

for (int i = 0; i < tabla.length && encontrado == false; i++) {
                        if (tabla[i].obtLetras().equals(letras) && tabla[i].obtNumero()==num) { //Hacemos las dos comparaciones en un mismo if directamente
                                        encontrado = true;
                               
                        }
}

Un saludo amigo ;)

Imagen de Josh G

Como hacer la prueba

Discupa mi ignorancia, soy novato en esto tambien ando viendo el mismo tema pero mi pregunta es una vez ya escrito este codigo como puedo hacer la prueba de que funciona? ya sea desde main o un Frame pues al llamar el metodo buscar me manda error estoy seguro que estoy haciendolo mal de eso no cabe duda dejo lo poco que llevo.

llamo a a las clases.

Patente p = new Patente();
TablaPatentes tp = new TablaPatentes();

y en el evento del boton:

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
String lt,nm;
lt = p.obtLetras();
lt = txtLetras.getText();
nm = Integer.toString(p.obtNumero());
nm = txtNum.getText();
tp.buscar();
}

hago mencion que a la clase tablapatenes le agrege JOptionPane para False "nohay datos " y true "El dato existe"

y pues obiamente siempre me lanzara que no se encuentra el dato por que no ingreso valores pero ni eso me manda jeje.

Por su atencion muchas gracias....

Imagen de iocio

No te preocupes...

Eso es porque no has ingresado ninguna Patente en el array. y por tanto te dara un error de NullPointerException al encontrarse con el array vacio de tamaño 9999.
Para ello haremos el array de tamaño 2, es decir posiciones 0 y 1 y añadiremos dos patentes manualmente en el main de tal modo (te lo hago en modo consola).

Me acabo de dar cuenta que te faltaba un constructor Patente con el que poder trabajar

public class Patente {
        private String letras;
        private int numero;

        public Patente(String letra, int num) { //Creamos el constructor pasandole como parametros las letras y numeros
                this.letras = letra;
                this.numero = num;
        }

        public String obtLetras() {
                return this.letras;
        }

        public int obtNumero() {
                return this.numero;
        }

}

Aqui te faltaba un getTabla para que pudieras trabajar con ella desde otra clase

public class TablaDePatentes {
        private Patente[] tabla;
       
       
        public TablaDePatentes() {
                tabla = new Patente[2]; //Hacemos el array de tamaño 2 para no volvernos locos. No es muy eficiente hacer un array de 9999 posiciones como tenias
        }
       
        public Patente[] getTabla(){
                return this.tabla;
        }
       
        /**
         * El problema de tu diseño es que los arrays (o arreglos) deben almacenar el tipo de dato que realmente quieres guardar, en tu caso un array de   Patentes  
         *
         */

        public boolean buscar(Patente patente) {
                int num = patente.obtNumero();
                String letras = patente.obtLetras();
                boolean encontrado = false;
                int len = tabla.length;
               
                for (int i = 0; i < tabla.length && encontrado == false; i++) { //El bucle seguira iterando hasta que acabe la tabla o hasta que encontrado == true.
                        if (tabla[i].obtLetras().equals(letras)) { //Comparamos las dos primeras posiciones del resultado de la tabla que coincida con las letras
                                if (tabla[i].obtNumero()==num) { //Comparamos las 3 ultimas posiciones del resultado de la tabla que coincida con las letras
                                        encontrado = true; //Al encontrarlo, encontrado == true por lo tanto sale del bucle y retorna el encontrado==true, si este caso nunca se da retornata encontrado == false;
                                }
                        }
                }
                return encontrado;
        }
}

Y una clase PRINCIPAL

public class Principal {

        /**
         * @param args
         */

        public static void main(String[] args) {
                // TODO Auto-generated method stub
                Patente patente = new Patente("PV", 1415); //Creamos una patente con los siguientes datos
                Patente patente2 = new Patente("HM", 1515); //Lo mismo de arriba
                TablaDePatentes ClaseTablaPatente = new TablaDePatentes(); //Creamos algo de tipo TablaDePatentes
                Patente[] tabla = ClaseTablaPatente.getTabla(); //Hacemos uso del getTable() que te comentado antes para trabajar con el array Patente[ ]

                tabla[0] = patente; //Añadimos las patentes creadas mas arriba
                tabla[1] = patente2; //Lo mismo

                Patente patenteParaBuscarTRUE = new Patente("PV", 1415); //Creamos una patente que buscaremos que dara TRUE al ser igual que la primera creada
                Patente patenteParaBuscarFALSE = new Patente("SP", 1111); //Creamos otra patente que buscaremos que dara FALSE al no existir arriba

                System.out.println(ClaseTablaPatente.buscar(patenteParaBuscarTRUE)); //Hacemos uso del metodo buscar con la patente que devolvera true
                System.out.println(ClaseTablaPatente.buscar(patenteParaBuscarFALSE)); //Y lo mismo para la de false.

        }

}

Y aqui te dejo ya los problemas solucionados.

Imagen de iocio

CONSEJO

Antes de añadir paneles y botones, probad con el modo consola que os salga todo OK. Tenéis que aprender a modularizar vuestro trabajo al igual en lo que se basa la orientación a objetos. Poco a poco y aprended a usar el DEBUGGER que sera de mucha utilidad. Yo utilizo eclipse como entorno de desarrollo y si bien es cierto que al principio cuesta un poco, os resolverá muchos problemas.

Imagen de Josh G

Gracias....

No me queda mas que agradecerte por la ayuda estoy seguro que esta informacion le va a servir a muchos, y espero algun dia poder apoyar a esta comunidad resolviendo los problemitas que llegan a presentar.

Una vez reitero mi agradecimiento por haber ilustrado la solucion al problema y por aqui andaremos.......

Imagen de gildardo

Muchas gracias

Agradezco mucho tu valioso apoyo ya que sin él no le hubiera entendido al problema planteado, te doy las gracias por el tiempo que te has invertido en contestarme y a la solución y realización de este problema, soy un novato en este lenguaje y me gustaría poder saber en dónde o con quien puedo tomar clases para poder comprender y entender más a fondo este lenguaje.

Sin ustedes no somos nada, ya que para las personas que apenas comenzamos es un valioso apoyo este foro.

Espero poder contar contigo en otra ocasión y te mando mi correo gildardov@gmail.com (esperando el tuyo también) para poderte enviar el código y que puedas corroborar que estuve bien en el desarrollo de esta actividad.

Te envío un fraternal saludo.

Gil

Imagen de gildardo

Ordenacion y Busqueda

Saludos amigo, el día de hoy me dejaron realizar el siguiente programa:

Implemente un programa que busque la mayor distancia entre un grupo de puntos e identifique los puntos que están a la mayor distancia encontrada.

Para esto pida al usuario el número de puntos a utilizar y luego cree cada uno de los puntos.

import iic1103Package.*;

public class Punto {
private double x;
private double y;

public Punto (double x, double y) {
this.x = x;
this.y = y;
}

public Punto () {
double r;
r = Aleatorio.real (0, 1000);
this.x = r;
r = Aleatorio.real (0, 1000);
this.y = r;
}

public double getX () {
return x;
}

public double getY () {
return y;
}

public double distancia ( Punto p) {
return ( Math. sqrt (( this.x - p.getX ()) * (this.x - p.getX ())
+ (this.y - p. getY ()) * (this.y - p. getY ())));
}
}

Luego de la ejecución su programa debe mostrar un mensaje como el siguiente:

La mayor distancia en el conjunto de puntos es 1058.91295913645 e involucra al punto 0: (10.920578500052901,15.64305239454644) y al punto 4: (644.0265655345464,864.4501354282548)

Yo realicé la siguiente estructura pero no sé si estoy bien, aunque corre el programa no me muestra los resultados pedidos, espero y me puedas ayudar, muchas gracias de antemano.

public class Punto {
   private int x;
   private int y;
       
public Punto(int x, int y) {
   super();
   this.x = x;
   this.y = y;
}

public int getX() {
   return x;
}

public void setX(int x) {
   this.x = x;
}

public int getY() {
   return y;
}

public void setY(int y) {
   this.y = y;
}
       
public double distanciaPunto (Punto p) {

//Funcion matematica de distancia entre dos puntos
   return Math.sqrt(  Math.pow( this.x - p.getX() ,  2 ) + Math.pow( this.y - p.getY() , 2 ) ) ;
}
       
public boolean equals( Punto p){
   return (this.x == p.getX() && this.y == p.getY());
}
public static void main(String[] args) {
// TODO code application logic here
    }
}

Ordenación y Busqueda

Hola que tal yo también tengo que resolver este problema y como tu también soy nuevo en esto de java espero nos podamos apoyar para poder resolverlo mira esto es lo que tengo .

package punto;

public class Punto {

   double x;
    double y;
   
    public Punto(double x,double y){
        this.x=x;
        this.y=y;
    }  
    public Punto(){
        x=0;
        y=0;
    }
    public void setX(double x){
        this.x=x;
    }
    public void setY(double y){
        this.y=y;
    }
    public double getX(){
        return x;
    }
    public double getY(){
        return y;
    }
  public double distancia(Punto objetoPunto){
 return Math.sqrt ((Math.pow (this.x - objetoPunto.getX(),2)) * ((Math.pow(this.y - objetoPunto.getY(),2))));

   
       
             
    }
    public String toString(){
        Punto g = new Punto();
        g.distancia(this);
        return
   "(" + x + "," + y + ")";
    }

    public static void main(String[] args) {

         Punto [ ]  arrPuntos={new Punto(4.5,7.5),new Punto (2.32,7.15),new Punto(2.2,2.45),new  Punto(8,2.65)};              //Asigno puntos
       
     Punto s = new Punto();
       

     System.out.println(s.toString());
   
       
}
}

A la hora de llamar al método donde se realiza la operacion desde el metodo distancia para mostrar el resultado desde me marca error al querer asignar una variable a la formula desde el método main y al llamar al metodo toString al correr el programa me manda los puntos en blanco ojala pudieran decirme donde esta el error ya que creo que nada mas falta eso para poder ejecutar el programa correctamente, cualquier cosa que quieran aportar se los agradeceré mucho

Imagen de neko069

Oh god, Why?

....para mostrar el resultado desde me marca error al querer ....

Porqué no pegan su stacktrace? u_u

Imagen de CuicaJavier

Recordar

Se se les hace recordar que su codigo lo publiquen entre code y /code dentro de <>

Imagen de gildardo

Saludos

Te envio lo que llevo, aunque en las dos clases me marcan todavía errores, espero poderlos resolver porque todavía aún no me queda.

Clase Principal Main

import iic1103Package.*;

public class Main {

public static void main(String[] args) {
    int n_puntos , i, j, p1 = 0, p2 = 0;
    double dist_max = 0;
    Punto[] puntos;
    n_puntos = Usuario.entero("Cuantos puntos usara para el ejercicio? ");
    puntos = new Punto[n_puntos];
    for (i = 0; i < n_puntos; i++) {
    puntos[i] = new Punto();
}
   for (i = 0; i < (n_puntos - 1); i++) {
    for (j = i + 1; j < n_puntos; j++) {
    if (puntos[i].distancia(puntos[j]) > dist_max) {
    dist_max = puntos[i].distancia(puntos[j]);
    p1 = i;
    p2 = j;
 }
 }
}

Usuario.mensajeConsola ("La mayor distancia en el conjunto de puntos es " + dist_max + " e involucra al punto "
+ p1 + ": (" + puntos[p1].getX() + "," + puntos[p1].getY() + ") y al punto " + p2 + ": (" + puntos[p2].getX()
+ "," + puntos[p2].getY() + ")");
}
}

Y la Clase Punto

import iic1103Package.*;

public class Punto {
private double x;
private double y;

public Punto(double x, double y) {
this.x = x;
this.y = y;
}

public Punto() {
double r;
r = Aleatorio.real (0,1000);
this.x = r;
r = Aleatorio.real (0,1000);
this.y = r;
}

public double getX() {
return x;
}

public double getY() {
return y;
}

public double distancia(Punto p) {
return (Math.sqrt((this.x - p.getX()) * (this.x - p.getX()
+(this.y - p.getY()) * (this.y - p.getY()))));
}
}

Investigando y experimentando

Investigando y experimentando un poco encontré el resultado

package punto;

import javax.swing.JOptionPane;

public class Punto {
private double x;
private double y;

double leepuntos(String v)
{
double n;
  try
{
n=Double.parseDouble(v);
}
     catch(Exception e)
{
n=0;
}
    return n;
}

public Punto(String m)
{
String n[]=m.split(",");

x=leepuntos(n[0]);
y=leepuntos(n[1]);
}

public Punto(double v)
{
setX(v);
setY(v);
}

public Punto(Punto otro)
{
setX(otro.getX());
setY(otro.getY());
}

void setX(double x_)
{
x=x_;
}
void setY(double y_)
{
y=y_;
}
double getX()
{
return x;
}
double getY()
{
return y;
}

public String toString()
{
return x+"";
}

public Punto equals(Punto  otro)
{
double d=Math.sqrt((getX()-otro.getX())*(getX()-otro.getX())+(getY()-otro.getY())*(getY()-otro.getY()));// Formula
Punto p=new Punto(d);
return p;
}

    public static void main(String[] args) {

String lee;
Punto a,b,distancia;

lee=JOptionPane.showInputDialog("CAPTURA LAS COORDENADAS DEL PRIMER PUNTO");

    a = new Punto(lee);

lee=JOptionPane.showInputDialog("CAPTURA LAS COORDENADAS DEL SEGUNDO PUNTO");
b=new Punto(lee);

distancia=a.equals(b);
JOptionPane.showMessageDialog(null,"LA DISTANCIA DENTRE LOS PUNTOS ES  "+distancia);
System.exit(0);
   
       
}
}

Al correr el programa recuerda cuando te pide ingresar las coordenadas de los punto pones los valores serados por comillas por ejemplo

JOptionPane.showInputDialog("CAPTURA LAS COORDENADAS DEL PRIMER PUNTO");

tu vas a capturar el valor de la siguiente manera :

7,5

donde
7 es x
5 es y

resolviendo este ejercicio me doy cuenta que me faltan muchas cosas por entender de Java

te dejo esta pagina: http://aprendejava2.blogspot.mx/2009/07/calcula-la-distancia-entre-dos-p... donde lo explican de manera mas sencilla para entenderlo mejor

Saludos y espero que te sea útil .

Imagen de gildardo

Hola

Te agradezco tu información y ya vi que efectivamente corre, si te puedo ayudar en algo no dudes en pedirmelo, tengo una duda?, estudias en la UNAD?

Saludos.

Así es me encuentro

Así es me encuentro estudiando en la UnAD jaja que coincidencia ya se me hacia raro lo del problema Saludos.

Imagen de gildardo

Hola

Ok ya somos dos, te mando mi correo por si necesitas algo en lo que te pueda ayudar, Saludos. gildardov@gmail.com

Imagen de Josh G

Solo como comentario

Compañeros creo que su solucioon es erronea lo unico que hace es calcular la distancia entre dos puntos, pero en ningun momento estan usando metodos de ORDENACION Y BUSQUEDA ya que segun su enunciado la finalidad es "\\Buscar la mayor distancia en un conjunto de puntos" mas no mostrar la distancia entre 2 puntos.....

Imagen de gildardo

Hola

Pues te comento, tienes toda la razón, pero si te das cuenta y si ingresas los datos que requieres veras que te de la distancia que se solicita, porque te comento que no sé nada de java (apenas le estoy medio entendiendo), y es la única forma que obtuve (gracias a un compañero) de realizar el ejercicio solicitado.

Si estas en la UNAD (que me imagino que sí), te comento que la actividad ya fué enviada, aceptada y aprobada por el maestro, pero la última palabra la tienes tú.

Saludos.

Hola compañeros yo también

Hola compañeros yo también soy estudiante de la UNAD, y soy nueva en lo que es programación en JAVA. por favor podrían asesorarme con algunos ejemplo, totorales, paginas web, donde pueda aprender mas , gracias por su ayuda.

Saludos

Ya realize el proyecto tal cual lo indica el usuario que nos mostro pero no me da ningun resultado

Me podrias ayudar

Hola ya realize el proyecto y

Hola ya realize el proyecto y corre al 100% haciendo lo que pide la instruccion pero....

Mi profesor me dice lo siguente (absurdo que quiera cambiar lo que se nos indico al principio pero bueno)...

El programa debe solicitar al usuario el número de puntos a utilizar, es decir, el usuario va a capturar un número cualquiera y el programa debe generar aleatoriamente esa cantidad de puntos.

Por ejemplo, si el usuario capturó el número 7, tu programa debe generar aleatoriamente 14 valores (entre 0 y 1000) para esos 7 puntos que serían las coordenadas X y Y de cada punto (imaginando un plano cartesiano). Posteriormente, debe calcular las distancias entre cualquier par de puntos (de los siete) e identificar con un mensaje final cuál distancia es la mayor.

Te sugiero que antes del mensaje que indique la distancia mayor el programa muestre los puntos generados.

Me podras ayudar porfavor? pollo_paco@hotmail.com