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 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:
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.
- gildardo's blog
- Inicie sesión o regístrese para enviar comentarios
Comentarios
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:
private String letras;
private int numero;
public Patente() {
}
public String obtLetras() {
return letras;
}
public int obtNumero() {
return numero;
}
}
Y la clase TablaDePatentes quedaria:
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.
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:
if (tabla[i].obtLetras().equals(letras) && tabla[i].obtNumero()==num) { //Hacemos las dos comparaciones en un mismo if directamente
encontrado = true;
}
}
Un saludo amigo ;)
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....
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
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
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
/**
* @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.
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.
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.......
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
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.
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.
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;
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
Oh god, Why?
Porqué no pegan su stacktrace? u_u
Recordar
Se se les hace recordar que su codigo lo publiquen entre code y /code dentro de <>
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
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
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
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 .
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.
Hola
Ok ya somos dos, te mando mi correo por si necesitas algo en lo que te pueda ayudar, Saludos. gildardov@gmail.com
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.....
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