Niezrozumienie metody

2016-07-19 22:44
0
package staticInnerClass;

/**
* Ten program demonstruje zastosowanie statycznych klas wewnętrznych.
* @version 1.01 2004-02-27
* @author Cay Horstmann
*/

public class StaticInnerClassTest
{
   public static void main(String[] args)
   {
      double[] d = new double[20];
      for (int i = 0; i < d.length; i++)
         d[i] = 100 * Math.random();
      ArrayAlg.Pair p = ArrayAlg.minmax(d);
      System.out.println("min = " + p.getFirst());
      System.out.println("max = " + p.getSecond());
   }
}

class ArrayAlg
{
    /**
    * Para liczb zmiennoprzecinkowych.
    */
   public static class Pair
   {
      private double first;
      private double second;

      /**
      * Tworzy parę dwóch liczb zmiennoprzecinkowych.
      * @param f pierwsza liczba
      * @param s druga liczba
      */
      public Pair(double f, double s)
      {
         first = f;
         second = s;
      }

      /**
      * Zwraca pierwszą liczbę z pary.
      * @return pierwsza liczba
      */
      public double getFirst()
      {
         return first;
      }

      /**
      * Zwraca drugą liczbę z pary.
      * @return druga liczba
      */
      public double getSecond()
      {
         return second;
      }
   }

   /**
   * Znajduje największą i najmniejszą wartość w tablicy.
   * @param values tablica liczb zmiennoprzecinkowych
   * @return para liczb, w której pierwsza liczba określa wartość najmniejszą, a druga
   * największą
   */
   public static Pair minmax(double[] values)
   {
      double min = Double.MAX_VALUE;
      double max = Double.MIN_VALUE;
      for (double v : values)
      {
         if (min > v) min = v;
         if (max < v) max = v;
      }
      return new Pair(min, max);
   }
}

W powyższym kodzie nie rozumiem działania metody minmax.

  1. W jaki sposób ona szuka wartości min i max ?
  2. Czemu w do zmiennej "min" przypisane jest MAX_VALUE i zmiennej "max" przypisane jest MIN_VALUE

W skrócie krótka metoda ale nie wiem jak działa.

edytowany 2x, ostatnio: golec2604, 2016-07-19 22:55
2016-07-19 23:10
0
 public static Pair minmax(double[] values)
   {
      double min = Double.MAX_VALUE; //zaczynamy szukanie od największej możliwej wartości (min z danej tablicy może być mniejsze niż maksymalna wartość danego typu zmiennej, ale na pewno nie większe, jest to więc pewna wartość graniczna)
      double max = Double.MIN_VALUE; //zaczynamy szukanie od najmniejszej możliwej wartości (max z danej tablicy może być większe niż minimalne wartość danego typu zmiennej, ale na pewno nie mniejsze, jest to więc pewna wartość graniczna)

      for (double v : values) //program przechodzi przez wszystkie wartości z tablicy values
      {
         if (min > v) min = v; //jeśli wartość z tablicy jest mniejsza od naszej min - to może być szukane minimum, wybieramy więc tę mniejszą wartość podpisujemy do min i kontynuujemy. Jeśli sprawdzana wartość nie jest mniejsza, nic się nie dzieje. 

         if (max < v) max = v; //jeśli wartość z tablicy jest większa od naszej max  - to może być szukane maximum, wybieramy więc tę większą wartość podpisujemy do max i kontynuujemy. Jeśli sprawdzana wartość nie jest większa, nic się nie dzieje. 

//Jeśli w kolejnych iteracjach znajdzie mniejszą wartość niż nowe min, znowu podstawi ją pod min i dalej będzie szukało mniejszej wartości. Analogicznie z max.
      }
      return new Pair(min, max); //zwraca znalezione min i max
   }

Pozostało 580 znaków

2016-07-20 00:06
0

Dzięki wielkie za taką fajna odpowiedź. Chodź przyznam że musiałem to kilka razy przeczytać aby zrozumieć. Teraz to wydaje sie banalnie proste. Zmyliły mnie te zmienne min i max a przecież szukaliśmy wartości minimalnej i maksymalnej danej tablicy a nie deklarowanych zmiennych. Pozdro.

Pozostało 580 znaków

2016-07-20 01:02
0

Abstrahując od metody, to ten kod to doskonały przykład, jak z 6 linijek kodu zrobić 60 dorzucając bezsensowne klasy, pola, getery i komentarze w stylu captain obvious.

Czyli... typowy kod Javy ;)


((0b10*0b11*(0b10**0b101-0b10)**0b10+0b110)**0b10+(100-1)**0b10+0x10-1).toString(0b10**0b101+0b100);

Pozostało 580 znaków

Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0