Wybór ceny z tabeli dwuwymiarowej

0

Tabela w stylu:
nagłówek wierszy: waga (przedziały)
nagłówek kolumn: liczba kilometrów (przedziały)
A zawartość tabeli to ceny. Jej wymiar to 18 wierszy 42 kolumny.

Chcę by użytkownik podał wagę i liczbę kilometrów i na podstawie tego pojawiła się cena.

Czego najlepiej tutaj użyć, żeby było to zrobione najsensowniej?

0

Nie rozumiem o co pytasz, ale i tak odpowiadam (zapewne nie na temat): JTable.

0

Zobaczę JTable

To może obrazowo:

qQVyt2U.png

Chce by użytkownik podał np. 57 km i 35 kg i żeby wyszło 69 zł.

dodanie obrazka do załączników posta - @furious programming

0

Jeśli chodzi o obliczanie, to starczą trzy tablice, dwie rosnące

int[] kilometry = {1,51,101,...};
int[] kilogramy = ...;

zawierające dolne granice przedziałów.
i trzecia z cenami

int[][] ceny = new int[kilometry.length][kilogramy.length];
0

To pewnie to co ja zdążyłem wymyślić pewnie dłuższe i do pupy? :)
Fragmenty kodu, żeby bylo bardziej czytelne.

        kgText = Integer.parseInt(kgTextField.getText()); //pobiera wagę od usera
        kmText = Integer.parseInt(kmTextField.getText());//pobiera kilometry od usera

        //tabela z cenami
        int[][] prices = new int[][]{
                {51, 65, 70, 77,...}

        //przerabia na index dla kilogramów
        if (kgText >= 1 && kgText <= 30) {
            kgIndex = 0;
        } else if (kgText >= 31 && kgText <= 60) {
            kgIndex = 1;
        } else if (kgText >= 61 && kgText <= 100) {
            kgIndex = 2;
        } else if (kgText >= 101 && kgText <= 150) {
            kgIndex = 3;
        }

       ////przerabia na index dla kilometrow
       if (kmText >= 1 && kmText <= 50) {
            kmIndex = 0;
        } else if (kmText >= 51 && kmText <= 100) {
            kmIndex = 1;
        } else if (kmText >= 101 && kmText <= 150) {
            kmIndex = 2;
        } else if (kmText >= 151 && kmText <= 200) {
            kmIndex = 3;
        }

        //wynik
        resultTextField.setText(String.valueOf(prices[kmIndex][kgIndex]));
0

Ten kod stanie się straszny gdy przedziałów wagowych (kilometrowych) będzie kilkadziesiąt, kilkaset. Ja miałem na myśli takie rozwiązania:

int[] kilometry = {1,51,101,151,...};
//bardziej zrozumiałe, ale mniej wydajne, bo przeszukuje tablicę liniowo
kmIndex = 0;
while(kmText>kilometry[kmIndex])
{
    kmIndex++;
}
//bardziej wydajne, korzysta z szukania binarnego
kmIndex = Arrays.binarySearch(kilometry,kmText);
if(kmIndex<0)
{
      kmIndex = -kmIndex-1;
}

Powyższa sztuczka wynika z tego co zwraca binarySearch gdy nie znajdzie https://docs.oracle.com/javase/7/docs/api/java/util/Arrays.html#binarySearch%28int%5B%5D,%20int%29.

0

Super, dzięki za pomoc.

0

W taki sposób to jednak nie wychodzi bo brakuje dokladniejszej informacji o przedziale.

Czyli np. 50 kg to przeskakuje do 2 wyrazu a powinno zostac na 1.
Ale domyslam sie, ze chciales mnie tylko naprowadzic ;)

0

Wystarczy drobna zmiana tablicy

double[] kilometry = {0.5,50.5,100.5,150.5,200.5,250.5};

W poprzedniej wersji niepoprawny wynik był dla 51 (101,...), a nie dla 50.

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