• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Początek przygody z Javą

Object Storage Arubacloud
+2 głosów
343 wizyt
pytanie zadane 26 października 2021 w Java przez Rafał Masny Obywatel (1,700 p.)

Witam. Postanowiłem zacząć podstawy Java. Robię jakieś zadana z list różnych uczelni. Natrafiłem na takie zadanie:

import java.util.Scanner;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.PrintWriter;
class GFG {

    static void swap(int[] arr, int i, int j) {
        int temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }

    static int partition(int[] arr, int low, int high) {
        int pivot = arr[high];
        int i = (low - 1);
        for (int j = low; j <= high - 1; j++) {

            if (arr[j] < pivot) {

                i++;
                swap(arr, i, j);
            }
        }
        swap(arr, i + 1, high);
        return (i + 1);
    }


    static void quickSort(int[] arr, int low, int high) {
        if (low < high) {

            int pi = partition(arr, low, high);

            quickSort(arr, low, pi - 1);
            quickSort(arr, pi + 1, high);
        }
    }

    static void printArray(int[] arr, int size) {
        for (int i = 0; i < size; i++)
            System.out.print(arr[i] + " ");

        System.out.println();
    }


    public static void main(String[] args) throws FileNotFoundException {
        File file = new File("In0101.txt");
        PrintWriter zapis = new PrintWriter("Out0101.txt");
        Scanner in = new Scanner(file);

        {
            int[] arr = {
                10,
                7,
                8,
                9,
                1,
                5
            };
            int n = arr.length;
            quickSort(arr, 0, n - 1);
            zapis.println("" + arr + " " + "");
            zapis.close();
        }

    }
}

Co robię nie tak, że w pliku out zapisuje się jakiś ciąg znaków, zamiast posortowanych liczb? Mógłby mi ktoś podpowiedzieć, jak przerobić kod, żeby cyfry były sczytywane z pliku .txt?

1 odpowiedź

+1 głos
odpowiedź 26 października 2021 przez Wiciorny Ekspert (269,710 p.)
edycja 26 października 2021 przez Wiciorny
zapis.println("" + arr + " " + "");

zapisujesz coś  "Arr" a co to jest arr? No to jest tablica, nie tekst, zapisywany jest hash obiektu arr :) 

np zapisując tablice stringu dostaniesz ;]

String[] objects = new String[10];
System.out.println(objects);
// zostanie wypisane  [Ljava.lang.String;@7291c18f -> to jest hash ;] 

dokonaj konwersji tablicy na string, masz do tego gotową metode nawet 
Arrays.toString https://www.tutorialspoint.com/java/util/arrays_tostring_int.htm

 

Weź pod uwagę istotną sprawe w javie dla przykładu twojej tablicy, przekazywane dane są zawsze przez wartość lub wartość referencji 

 // twoja tablica przed 

 int[] arr = {
                10,
                7,
                8,
                9,
                1,
                5
        };

  addSome(arr);

// nastepnie tak wygląda metoda 
public static void addSome(int[] arr) {
        arr[0] = 11;
         int[] arr2 = arr; // przypisanie referencji 
       arr = new int[5]; // nowa tablica, czy aby napewno ? 
        arr2[2]= 555;
        arr[1]= 9;
}
// po wykonaniu tej metody twoja tablica 
// [11, 7, 555, 9, 1, 5]

 

komentarz 26 października 2021 przez Rafał Masny Obywatel (1,700 p.)
Ach, no tak. Teraz muszę rozkminić jak wczytać dane z pliku :]
komentarz 26 października 2021 przez Wiciorny Ekspert (269,710 p.)
 public class Odczyt {
     public static void main(String[] args) throws FileNotFoundException {
         File file = new File("ala.txt");
         Scanner in = new Scanner(file);
 
         String zdanie = in.nextLine();
         System.out.println(zdanie);
     }
 }

przykład funkcja nextLine() - pobiera ci linie z pliku 

komentarz 26 października 2021 przez Rafał Masny Obywatel (1,700 p.)

Tak, to wiem. Ale nie wiem jak zrobić w tym konkretnym przypadku (pewnie banał) - żeby w kodzie nie mieć wpisanych liczb do posortowania, tylko sortować te, które są w pliku In.txt.

Bo jeżeli dopiszę teraz

 String zdanie = in.nextLine();
 System.out.println(zdanie);

to owszem, w terminalu wypisane są liczby z In.txt, w Out.txt są posortowane, ale 'wzięte' z kodu.

Ech. czuję, że to będzie większa sprawa. No nic, szukam dalej odpowiedzi jak to zrobić ;p

komentarz 26 października 2021 przez Rafał Masny Obywatel (1,700 p.)

@Wiciorny, powiedz proszę, czy ten QuickSort robię według polecenia, czyli rekurencyjnie?

komentarz 26 października 2021 przez Wiciorny Ekspert (269,710 p.)
Scanner scanner = new Scanner(new File("twoj_tekstowy_plik.txt"));
int [] tablica= new int [100];
int i = 0;
while(scanner.hasNextInt())
{
     tall[i++] = scanner.nextInt();
}
// jesli wiesz, ze masz same inty ;) 

jeśli liczby nie są oddzielone  spacją w innym wypadku  

12345 to nie to samo co 1 2 3 4 5 

polecam w ogóle skorzystać z list ale w ramach zadania trzeba na typie tablic 

komentarz 26 października 2021 przez Wiciorny Ekspert (269,710 p.)
generalnie ten kod nie pisałeś sam - > https://www.geeksforgeeks.org/quick-sort/
więc też miej to na uwadze. Tak jest rekurencyjny
komentarz 26 października 2021 przez Rafał Masny Obywatel (1,700 p.)

Tak, nie pisałem sam :-) Sortowanie odbywa się tak, jak jest w poleceniu napisane, ale

int [] tablica= new int [5];

Tutaj musiałem wpisać [5], bo gdy było więcej (a liczb do sortowania mniej) wypisywane były zera. A gdy wpiszę w out.txt więcej niż 5 cyfr, to program wyrzuca błąd. Jak rozwiązać ten problem?

import java.util.Arrays;
import java.util.Scanner;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.PrintWriter;
class GFG {

    static void swap(int[] arr, int i, int j) {
        int temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }

    static int partition(int[] arr, int low, int high) {
        int pivot = arr[high];
        int i = (low - 1);
        for (int j = low; j <= high - 1; j++) {

            if (arr[j] < pivot) {

                i++;
                swap(arr, i, j);
            }
        }
        swap(arr, i + 1, high);
        return (i + 1);
    }


    static void quickSort(int[] arr, int low, int high) {
        if (low < high) {

            int pi = partition(arr, low, high);

            quickSort(arr, low, pi - 1);
            quickSort(arr, pi + 1, high);
        }
    }

    static void printArray(int[] arr, int size) {
        for (int i = 0; i < size; i++)
            System.out.print(arr[i] + " ");

        System.out.println();
    }


    public static void main(String[] args) throws FileNotFoundException {
        File file = new File("In0101.txt");
        PrintWriter zapis = new PrintWriter("Out0101.txt");
        Scanner scanner = new Scanner(new File("In0101.txt"));
        int [] tablica= new int [5];
        int i = 0;
        while(scanner.hasNextInt())
        {
            tablica[i++] = scanner.nextInt();
        }
        quickSort(tablica, 0, i - 1);
        zapis.println(Arrays.toString(tablica));
        zapis.close();



    }
}

 

komentarz 26 października 2021 przez Wiciorny Ekspert (269,710 p.)

powiem tak 

Jak rozwiązać ten problem?

zacząć od podstaw programowania

od tablic i indeksowania elementów :)  https://strefainzyniera.pl/artykul/1054/tablice--java

w ogóle przerobić materiały podstaw programowania w javie, potem zaczynać pisać programy samodzielnie. 

1
komentarz 26 października 2021 przez Wiciorny Ekspert (269,710 p.)
while(scanner.hasNextInt())
        {
            tablica[i++] = scanner.nextInt();
        }

to się wykona przed quick sortem :), w out wpisujesz  tablce, ale weź pod uwagę że 

tab[5] -> to tablica która przechować moze 5 elementów, ale indeksowane są od 0 więc nie możesz dodać elementu do arr[5] np :)

int arrTwo[] = new int[5];
arrTwo[0] =1;
arrTwo[1] =2;
arrTwo[2] =3;
arrTwo[3] =3;
arrTwo[4] =3;

Podobne pytania

+2 głosów
3 odpowiedzi 170 wizyt
0 głosów
3 odpowiedzi 769 wizyt
0 głosów
1 odpowiedź 3,424 wizyt
pytanie zadane 9 maja 2017 w Java przez Milesq Nałogowiec (32,020 p.)

92,555 zapytań

141,403 odpowiedzi

319,560 komentarzy

61,941 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...