Ordinamento rapido Java, lettura da un file di input dell'utente in qualsiasi array (da ordinare)

StackOverflow https://stackoverflow.com/questions/1684215

  •  18-09-2019
  •  | 
  •  

Domanda

Che succede, ragazzi?

Sto provando a scrivere del codice in Java che leggerà i numeri da un file (un # su ogni riga del file .txt), li inserirà in un array e quindi eseguirà l'ordinamento rapido sull'array.Eclipse mostra del rosso con cui ho problemi.I miei errori sono contrassegnati con commenti e qual è l'errore, se qualcuno può aiutarmi a farlo funzionare, grazie a tutti!

-Kyle

OK, ho aggiornato con le prime due risposte, grazie per ora, ma altri due errori non riesco davvero a capire.

import java.io.*;
import java.util.Scanner;
import java.io.BufferedReader;
import java.io.File;


public class Lab3 {

public static void main(String[] args) throws IOException{


    System.out.print("Name of file with array: ");
    Scanner readIn = new Scanner(System.in);
    String input=readIn.nextLine();}
**testScan1(input);** //Return Type for method is missing (but I am trying to call the method here)


public static void testScan1(String filename)

{
    File file = new File(filename);
    Scanner scan;
    int [] array = new int[5];
    try{


        scan = new Scanner( file );
    }
    catch ( java.io.FileNotFoundException e )
    {
        System.out.println( "couldn't open. file not found "  );
        return;
    }
    while(scan.hasNext())
    {
        for( int i = 0; i <= file.length(); ++i)
        {

            **array[i]=scan.next();** /*Type mismatch, cannot convert from sting to int. (I moved the declaration about try?)*/




        }

        int partition(int arr[], int left, int right)
        {
            int i=left; int j = right;
            int tmp;
            int pivot = arr[(left+right)/2];
            while (i<=j){
                while(arr[i]<pivot)
                    i++;
                while (arr[j]>pivot)
                    j--;
                if (i<=j){
                    tmp=arr[i];
                    arr[i]=arr[j];
                    arr[j]=tmp;
                    i++; j--;
                }
            }
            return i;
        }
        void quickSort(int arr[], int left, int right){
            int index = partition(arr, left, right);
            if (left<index-1);
            quickSort(arr, left, index-1);
            if (index<right)
                quickSort(arr, index, right);
        }
    }
È stato utile?

Soluzione

Alcuni errori:

  • public testScan1(String filename) in realtà non ha alcun tipo di ritorno e si chiama anche da un contesto statico, ma non è statica. Esso deve essere modificato in public static void testScan1(String filename).
  • qual è lo scopo di file.hasNext()? Naturalmente non esiste perché non significa nulla. Credo che si intende scan.hasNext().
  • array non può essere trovato in quanto è definito in un blocco try/catch quindi è presente solo all'interno di tale ambito. Spostare la definizione prima della prova.

Oltre cercare di rientrare il codice in maniera più leggibile, perché è veramente difficile trovare gli errori. Per esempio il motivo per cui v'è una } brack prima della chiamata di testScan che cade dal metodo principale da cui suppongo si voglia chiamare?

Altri suggerimenti

Ogni volta che hai a che fare con un algoritmo ricorsivo e si ottiene un overflow dello stack, è perché l'algoritmo non dispone di un caso limite ben definito che causerà il vostro ricorsione per terminare. (O il vostro input è semplicemente troppo grande, ma questo è raramente il caso, e non è il caso qui.)

Si dovrebbe guardare il metodo quickSort() per vedere quello che potrebbe essere rendendo chiamare se stessa all'infinito. Pensate di guardare una riflessione con due specchi, in cui il riflesso rimbalza dell'altro riflessione e si spegne verso l'infinito ... questo è ciò che sta accadendo qui.

Inoltre, nel linguaggio Java, si consiglia di iniziare sempre il nome della classe con la lettera maiuscola. Vorrei un nome al QuickSortHomework classe o qualcosa del genere.

Inoltre, si potrebbe desiderare di leggere su come l'istruzione if funziona in Java, e come "blocchi" sono definiti. Hai una dichiarazione if nei pressi di un punto e virgola e un paio di parentesi graffe che non è probabilmente fare quello che si pensa che sta facendo.

Onestamente, mi sto tipo di infastidito tutte le ripubblica e ristampato qui.

Questo non è quello che si desidera ascoltare è, ma mi sento che si sta utilizzando questo sito come una stampella. Non mi sembra di essere messa nel tempo di decifrare per lei che cosa sta succedendo. Questo sconcertante out, non importa quanto sia doloroso, è dove l'apprendimento reale viene.

In questo caso, se hai guardato a ciò che significa che l'errore, e poi basta solo guardato il vostro quicksort () implementazione penso che avrebbe dovuto notare c'è qualcosa di molto, ovviamente, che non va.

EDIT: se stai pensando "ma I ha cercare di decifrare fuori" ... aiuta davvero ad includere nel post, "ho pensato che potrebbe essere questo, ma che didn 't lavoro, così ho pensato che forse potrebbe essere ....", ecc la metà del tempo si improvvisamente conto del problema, mentre si sta cercando di parlare attraverso di essa come questo. L'altra metà, almeno vediamo che si sta cercando.

Come ti ho detto nel precedente matrice questione non può essere trovato, perché è ancora in blocco try.

Quindi per voi la stampa non può stampare direttamente un array in un modo utile, si dovrebbe iterare su ogni elemento e stamparlo nel seguente modo:

for (int i = 0; i < array.length; ++i)
     System.out.println(array[i]+" ");

Ecco a voi:

import java.io.*;
import java.io.File;
import java.util.Scanner;

public class sdfs
{
    public static void main(String[] args) throws IOException
    {
        System.out.print("Name of file with array: ");
        Scanner readIn = new Scanner(System.in);
        String input = readIn.nextLine();   
    }

    public static void testScan1(String filename)
    {
        File file = new File(filename);
        Scanner scan;
        int[] array;

        try
        {
            array = new int[5];
            scan = new Scanner(file);
        }
        catch (java.io.FileNotFoundException e)
        {
            System.out.println("couldn't open. file not found ");
            return;
        }
        while (scan.hasNext())
        {
                for (int i = 0; i <= file.length(); ++i)
                {
                    array[i] = Integer.parseInt(scan.next()); 

                    for (int j = 0; j < array.length; ++j)     
                        System.out.println(array[i]+" ");
                }
        }
    }

    int partition(int[] arr, int left, int right)
    {
        int i = left;
        int j = right;
        int tmp;
        int pivot = arr[(left + right) / 2];
        while (i <= j) {
                while (arr[i] < pivot)
                        i++;
                while (arr[j] > pivot)
                        j--;
                if (i <= j) {
                        tmp = arr[i];
                        arr[i] = arr[j];
                        arr[j] = tmp;
                        i++;
                        j--;
                }
        }
        return i;
    }

    void quickSort(int[] arr, int left, int right)
    {
        int index = partition(arr, left, right);
        if (left < (index - 1)) {
                ;
        }
        quickSort(arr, left, index - 1);
        if (index < right) {
                quickSort(arr, index, right);
        }
    }
}

Cerca di aiuto come l'indentazione nel codice di lettura ..

Il problema è che testScan1 ha bisogno di un tipo di ritorno, anche se questo tipo è vuoto.

IIRC, non credo che è possibile stampare un array e vedi tutti i valori, come si può in Python o Scala. Dovrete scorrere l'array per stampare i valori:

for (int i = 0; i < array.length; i++) {
   System.out.println(array[i]);
}

Hai due problemi.È necessario definire l'array all'esterno del blocco try.Come questo:

 int[] array = new int[5];
 Scanner scan;
 try {
    scan = new Scanner(file);
 } catch (java.io.FileNotFoundException e) {
      //etc.

Anche questo funziona davvero solo perché ritorni nel blocco eccezione, altrimenti il ​​compilatore si lamenterebbe del fatto che è possibile che sia stata lanciata un'eccezione e scan non è mai stato assegnato.

Per stampare, utilizzare System.out.println(java.util.Arrays.toString(array));

Ciò lo renderà in un formato leggibile.Otterrai qualche strana spazzatura interna (ok forse è duro, ma è così che penso al comportamento predefinito) se stampi semplicemente il valore toString() dell'array (che è ciò che succede se lo passi semplicemente a println metodo).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top