SOLUCIONES NUBEPUNTOS

1.       Un método tal que dado un valor real nx devuelva el número de puntos que tienen abscisa mayor de nx.

// Esquema de filtro+contador. Normalmente los contadores se definirían Integer pero por
// compatibilidad con el método count de Java 8 devolvemos un Long
public Long getNumPuntosAbsMayor(Double nx) {
  Long cont=0L; // La L indica que es un Long
  for (Punto p:nube){
         if (p.getX().compareTo(nx)>0){
                 cont++;
         }
  }
  return cont;
}

// Java 8
public Long getNumPuntosAbsMayor(Double nx) {
  return nube.stream().filter(x->x.getX().compareTo(nx)>0).count();
}

 

2.       Un método tal que dado un valor de TipoCuadrante devuelva el número de puntos en ese cuadrante, no olvide los puntos sobre los ejes.

public Long getNumPuntosCuadrante(TipoCuadrante t){
  Long cont=0L; // La L indica que es un Long
  for(Punto p: nube){           
         if (p.getCuadrante().equals(t)){
                 cont++;
         }
  }
  return cont;
}

// Java 8
public Long getNumPuntosCuadrante(TipoCuadrante t){
  return nube.stream().filter(p->p.getCuadrante().equals(t)).count();
}

 

3.       Un método tal que dado un valor real d devuelva el número de puntos cuya distancia al origen es menor que d.

// igual que los anteriores     
public Long getNumPuntosDistOrigenMenor(Double d) {
  Long cont= 0L;
  for (Punto p:nube){
         if (p.getDistanciaAlOrigen().compareTo(d)<0){
                 cont++;
         }
  }
  return cont;
}

// Java 8
public Long getNumPuntosDistOrigenMenor(Double d) {
   return nube.stream().
         filter(x->x.getDistanciaAlOrigen().compareTo(d)<0).count();
}

4.       Devuelva un Punto que sea el centro de gravedad de la nube. Esto es, el punto cuyas coordenadas son la media de las coordenadas de los puntos.

// Esquema de suma con media aritmética al final
public Punto getCentroGravedad() {
  Double sumx=0.,sumy=0.;
  for(Punto p:nube){
          sumx = sumx + p.getX();
          sumy = sumy + p.getY();
  }
  return new PuntoImpl(sumx/nube.size(),sumy/nube.size());
}
 

// En Java 8 podemos trabajar con la media directamente
public Punto getCentroGravedad() {
  Double avgx = nube.stream().
          collect(Collectors.averagingDouble(Punto::getX));
  Double avgy = nube.stream().
          collect(Collectors.averagingDouble(Punto::getY));
  return new PuntoImpl(avgx,avgy);
}

 

5.       Devuelva si existe algún punto sobre el eje de abscisas.

// esquema existe       
public Boolean existePuntoEjeAbscisas() {
  Boolean res=false;
        
  for(Punto p:nube){
          if (p.getY().equals(0.)){
                  res=true;
          }
  }
  return res;
}

// En Java 8
public Boolean existePuntoEjeAbscisas() {
  return nube.stream().anyMatch(x->x.getY().equals(0.));
}

 

6.  Dado un Punto p y un radio r devuelva si existe algún punto dentro del círculo de centro p y radio r. (Esquema existe)

// esquema existe       
public Boolean existePuntoDentroCirculo(Punto c, Double r) {
  Boolean res=false;
  for(Punto p:nube){
          if (p.getDistanciaOtroPunto(c).compareTo(r)<0){
                  res=true;
          }
  }
  return res;
}

// En Java 8
public Boolean existePuntoDentroCirculo(Punto c, Double r) {
  return nube.stream().
        anyMatch(x->x.getDistanciaOtroPunto(c).compareTo(r)<0);
}

7.  Dado un valor real d, devuelve si es cierto que todos los puntos están a una distancia al origen menor que d.

// esquema para todo
public Boolean estanTodosADistMenor(Double d) {
  Boolean res=true;
  for(Punto p:nube){
          if (p.getDistanciaAlOrigen().compareTo(d)>0){
                  res=false;
          }
  }
  return res;
}

// En Java 8
public Boolean estanTodosADistMenor(Double d) {
   return nube.stream().
        allMatch(x->x.getDistanciaAlOrigen().compareTo(d)<0);
}

8.  Devuelve el Punto más lejano al origen de coordenadas.

//Máximo usando un comparator y el método max de la clase Collections. En Java 7 el
// Comparator es una clase que se debe definir aparte
public class ComparadorDistanciaOrigen implements Comparator<Punto> {
  public int compare(Punto p, Punto q){
      return p.getDistanciaAlOrigen().compareTo(q.getDistanciaAlOrigen());
  }
}
 
public Punto getMasLejanoOrigen() {
  return Collections.max(nube, new ComparadorDistanciaOrigen());
}

// En Java 8 no hace falta definir la clase Comparator sino que usamos la propiedad
// distanciaAlOrigen de Punto junto con el método comparing. El get es necesario por si la
// colección está vacía.
public Punto getMasLejanoOrigen() {
  return nube.stream().
         max(Comparator.comparing(Punto::getDistanciaAlOrigen)).get();
}

9.  Dado un Punto p, devuelva el punto de la nube más cercano.

// Es un problema de mínimo que tiene la dificultad de que el Comparator debe tener un
// atributo (base) que es el punto al que le calculamos el vecino y que debe ser argumento
// en el constructor
public class ComparadorDistanciaPunto implements Comparator<Punto> {
   Punto base;
 
   public ComparadorDistanciaPunto(Punto p){
      base=p;
   }
   public int compare(Punto p1, Punto p2){
     return p1.getDistanciaOtroPunto(base).
                 compareTo(p2.getDistanciaOtroPunto(base));
   }
}
public Punto getPuntoMasCercano(Punto p) {
   return Collections.min(nube, new ComparadorDistanciaPunto(p));
}

// Esto es un mínimo con Comparator aunque eb Java 8 ahora no nos basta con invocar a un
// método get, sino que hay que definir el Comparator, aunque no es necesaria una clase y
// se puede hacer en el mismo código de NubeImpl mediante una lambda expresión.
public Comparator<Punto> comparadorDistanciaPunto(Punto base){
   return (x,y)->
      x.getDistanciaOtroPunto(base).
               compareTo(y.getDistanciaOtroPunto(base));
}
 
public Punto getPuntoMasCercano(Punto p) {
   return nube.stream().min(comparadorDistanciaPunto(p)).get();
}

10. Dado un valor real d, devuelva una NubePuntos con aquellos que estén a una distancia menor que d del origen.

// Este es un esquema de filtro, como queremos encapsular la colección de Punto devolvemos
// un objeto NubePuntos y no un List<Punto>. Para ello nos hace falta un constructor de
// NubePunto a partir de un  List<Punto>. Este constructor será private y sólo se usará en
// este método. El constructor público será leyendo desde un fichero. De esta manera el
// atributo de tipo List<Punto> queda oculto.   
 
public NubePuntos getPuntosMenorDistanciaOrigen (Double d){
  List<Punto>fil=new ArrayList<Punto>();
  for (Punto p:nube){
         if (p.getDistanciaAlOrigen().compareTo(d)<0){
                 fil.add(p);
         }
  }
  return new NubePuntosImpl(fil);
}

// En Java 8 el filtro se consigue con el método filter para seleccionar y el método
// collect para devolver una Colección de tipo List en este caso.
public NubePuntos getPuntosMenorDistanciaOrigen (Double d){
  List<Punto> fil = nube.stream().
       filter(x->x.getDistanciaAlOrigen().compareTo(d)<0).
       collect(Collectors.toList());
  return new NubePuntosImpl2(fil);
}

No hay comentarios:

Publicar un comentario