Java QuickSort, a leitura de um arquivo de entrada do usuário em uma matriz (a serem classificados)

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

  •  18-09-2019
  •  | 
  •  

Pergunta

Qual é a vocês,

Eu estou tentando escrever algum código em Java que irá ler os números de um arquivo (um # em cada linha do arquivo .txt) colocá-los em uma matriz, e depois executar rápida tipo na matriz. Eclipse está mostrando algum vermelho que eu estou tendo problemas com. Meus erros são marcadas com os comentários, e qual é o erro, se alguém pode me ajudar a conseguir isso para executar, graças a todos!

-Kyle

OK, eu atualizado com as duas primeiras respostas, Graças até agora, mas dois mais erros Im não realmente entender.

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);
        }
    }
Foi útil?

Solução

Alguns erros:

  • public testScan1(String filename) realmente não tem qualquer tipo de retorno e também é chamado de um contexto estático, mas não é estática. Ele deve ser alterado para public static void testScan1(String filename).
  • qual é o propósito de file.hasNext()? Claro que não existe porque não faz nada média. Eu acho que você quis scan.hasNext().
  • array não pode ser encontrada porque é definido dentro de um bloco try/catch por isso é presente somente dentro desse âmbito. Mova a definição antes tentativa.

Além disso tentativa de código travessão de uma forma mais legível, porque é realmente difícil encontrar erros. Por exemplo porque é que há um } brack antes da chamada de testScan que cai fora do método principal a partir do qual eu suponho que você quiser chamá-lo?

Outras dicas

Sempre que você está lidando com um algoritmo recursivo e você terá um estouro de pilha, é porque o seu algoritmo não tem um caso extremo claramente definido que fará com que seu recursão para terminar. (Ou a sua entrada é muito grande, mas isso raramente é o caso, e não é o caso aqui.)

Você deve olhar para o seu método quickSort() para ver o que poderia ser tornando-se chamar-se infinitamente. Pense olhando para uma reflexão com dois espelhos, onde os saltos reflexo da outra reflexão e ele sai para o infinito ... que é o que está acontecendo aqui.

Além disso, na linguagem Java, recomenda-se começar sempre seu nome de classe com uma letra maiúscula. Gostaria de citar o seu QuickSortHomework classe ou algo parecido.

Além disso, você pode querer ler sobre como a declaração if funciona em Java, e como "blocos" são definidos. Você tem uma declaração if perto de um ponto e vírgula e um par de chaves que provavelmente não está fazendo o que você pensa que está fazendo.

Honestamente, eu estou ficando um pouco irritado com todos os reposts e reposts aqui.

Este não é o que você quer ouvir, mas eu sinto que você está usando este site como uma muleta. Você não parece estar colocando no tempo para decifrar por si mesmo o que está acontecendo. Isso intrigante out processo, não importa o quão doloroso, é onde a aprendizagem real vem.

Neste caso, se você olhou para o que isso significa de erro e, em seguida, você apenas olhou para sua implementação QuickSort () Eu acho que você teria de aviso há algo muito obviamente errado com ele.

EDIT: se você está pensando "mas eu fez tentar confundir-lo" ... ele realmente ajuda a incluir em seu post, "Eu pensei que poderia ser isso, mas que didn 't trabalho, então eu pensei que talvez ele poderia ser ...." etc. Metade do tempo você de repente percebe o problema, enquanto você está tentando falar com ele assim. A outra metade, pelo menos, vemos que você está tentando.

Como lhe disse na matriz pergunta anterior não puder ser encontrado, porque ele ainda está em bloco try.

Em seguida, para a impressão de que você não pode imprimir diretamente um conjunto de uma forma útil, você deve iterar sobre cada elemento e imprimi-lo da seguinte maneira:

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

Aqui são:

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);
        }
    }
}

Veja como indention ajuda na leitura de código ..

Seu problema é que testScan1 precisa de um tipo de retorno, mesmo se esse tipo é nula.

IIRC, eu não acho que você pode imprimir um array e veja todos os valores, como você pode em Python ou Scala. Você vai ter que percorrer a matriz para imprimir os valores:

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

Você tem dois problemas. Você precisa definir sua matriz fora do bloco try. Como esta:

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

Mesmo que só funciona realmente porque você voltar no bloco de exceção, caso contrário, o compilador se queixam de que é possível que uma exceção foi acionada e scan nunca foi atribuído.

Para imprimir, use System.out.println(java.util.Arrays.toString(array));

Isso vai torná-lo em um formato legível. Você vai ter algum lixo interno estranho (ok talvez isso é duro, mas é assim que eu penso o comportamento padrão) se você apenas imprimir o valor toString () da matriz (que é o que acontece se você apenas passá-lo para o println método).

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top