2009-11-05 4 views
0

Что до y'all,Java быстрой сортировки, чтение из файла ввода пользователя в любой массив (для сортировки)

Я пытаюсь написать код в Java, который будет читать в номера из файла (один # в каждой строке .txt-файла) помещают их в массив, а затем запускают быстрый сортировку по массиву. Eclipse показывает красный цвет, с которым у меня возникают проблемы. Мои ошибки отмечены комментариями, и что такое ошибка, если кто-нибудь может помочь мне запустить это, спасибо всем!

-Kyle

ОК, я обновил с первых двух ответов, спасибо до сих пор, но еще две ошибки Im действительно не понимая.

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

Я просто задаю вопрос, потому что это не является общим интересом для кого-либо еще, кроме афер. без обид. удачи в классе. –

+1

+1, потому что вы упрямы – Jack

ответ

4

Некоторые ошибки:

  • public testScan1(String filename) на самом деле не имеет никакого возвращаемого типа, и это также вызывается из статического контекста, но это не является статичным. Его следует заменить на public static void testScan1(String filename).
  • Какова цель file.hasNext()? Конечно, этого не существует, потому что это ничего не значит. Думаю, вы имели в виду scan.hasNext().
  • array не может быть найден потому, что он определен внутри блока try/catch, поэтому он присутствует только внутри этой области. Переместите определение перед попыткой.

Кроме того, попробуйте сделать код отступа более удобным для чтения способом, потому что очень трудно найти ошибки. Например, почему есть столбец } перед вызовом testScan, который выпадает из основного метода, из которого, я полагаю, вы хотите его назвать?

+0

Отлично, спасибо Джеку, «array [i] = scan.next() по-прежнему остается проблемой даже после перемещения объявления о блоке try. – Benzle

+0

Теперь ошибка отличается, класс Scanner работает, указав тип вещи, которую вы хотите для чтения из потока.Если вы используете plain scan.next(), тип возврата - String, поэтому вы должны преобразовать его в нужный номер. В вашем случае вы можете решить его с помощью ** array [i] = Integer. parseInt (scan.next()) ** или с ** array [i] = scan.nextInt() ** Они такие же. – Jack

+0

Хорошо, спасибо, Джек, я внес много изменений и собираюсь для repost, я думаю, что вопрос изменился настолько, что его новый. – Benzle

1

Ваша проблема в том, что testScan1 нужен тип возврата, даже если этот тип недействителен.

+0

Хорошо, установите тип возврата в пустоту, не так ли? – Benzle

2

Как я уже говорил, в предыдущем массиве вопросов не найдено, потому что он все еще находится в блоке try.

Тогда для печати вы не можете напрямую печатать массив в полезном способе, вы должны перебрать все элементы и распечатать его следующим образом:

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

Здесь вы:

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

Посмотрите, как отменить помощь при чтении кода.

+0

Спасибо, сэр! Мои скобки все еще где-нибудь, вы можете помочь мне с размещением ?: (ошибки в первых трех вместе и в последнем, в фрагменте , \t \t \t}}} \t \t \t \t \t массив [I] = Integer.parseInt (scan.next()); \t \t \t \t для (INT I = 0; я Benzle

+0

Подожди секунду, я отредактирую свой ответ – Jack

1

IIRC, я не думаю, что вы можете печатать массив и видеть все значения, как вы можете в Python или Scala. Вам нужно будет пройти через массив для печати значений:

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

У вас есть две проблемы. Вам нужно определить свой массив вне блока try. Как это:

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

Даже то, что только действительно работает, потому что вы возвращаетесь в блоке исключения, в противном случае компилятор будет жаловаться, что вполне возможно, что было брошено исключение и scan никогда не был назначен.

Для печати используйте System.out.println(java.util.Arrays.toString(array));

Это сделает его в удобном для чтения формате. Вы получите какой-то странный внутренний мусор (хорошо, может быть, это жестко, но так я думаю о поведении по умолчанию), если вы просто напечатаете значение toString() массива (что и происходит, если вы просто передаете его в println метод).

9

В любое время, когда вы имеете дело с рекурсивным алгоритмом, и вы получаете переполнение стека, это потому, что ваш алгоритм не имеет четко определенного края, который приведет к завершению рекурсии. (Или ваш ввод слишком велик, но это редко бывает, и это не так.)

Вы должны посмотреть на свой метод quickSort(), чтобы увидеть, что может заставить его называть себя бесконечно. Подумайте, глядя на отражение с двумя зеркалами, где отражение отскакивает от другого отражения, и оно уходит в бесконечность ... вот что происходит здесь.

Кроме того, на языке Java рекомендуется всегда начинать свое имя класса с заглавной буквы. Я бы назвал ваш класс QuickSortHomework или что-то в этом роде.

Кроме того, вы можете прочитать, как работает оператор if на Java и как определяются «блоки». У вас есть оператор if рядом с точкой с запятой и пара фигурных скобок, которая, вероятно, не делает то, что, по вашему мнению, делает.

+3

+1 за то, что так приятно об этом, что я не мог собрать. –

5

Честно говоря, я получаю раздражение от всех репозов и репостов здесь.

Это не то, что вы хотите услышать, но я чувствую, что вы используете этот сайт как костыль. Кажется, вы не ставите себе время, чтобы разобраться в себе, что происходит. Этот загадочный процесс, независимо от того, насколько болезненным, является то, откуда приходит реальное обучение.

В этом случае, если вы посмотрели, что означает эта ошибка, а затем вы просто посмотрели на реализацию quickSort(), я думаю, вы должны заметить, что с ней что-то очень явно не так.

EDIT: если вы думаете «но я не знаю, поэтому я подумал, может быть, это может быть ... »и т. д. Половина времени вы вдруг поймете проблему, пока вы пытаетесь говорить через нее так. Другая половина, по крайней мере, мы видим, что вы пытаетесь.

+2

На самом деле, я думал, что вопрос выглядит знакомым, но после этого я вернулся и посмотрел на предыдущие вопросы Бензле - в прошлый раз я дал этот ответ: http://stackoverflow.com/questions/1597831/starting-with-java- рекурсия-вероятно-просто-для-большинства/1597889 # 1597889. Примечательно, что я писал: «Я подозреваю, что вы просто не понимаете, что вы пытаетесь сделать. Это не может быть исправлено здесь - вам нужно потратить больше времени на изучение, пока вы не получите его». –

+1

Закажите свои вопросы от самых старых до самых старых и еще хуже. Он задавал этот вопрос 3 раза за последние несколько часов. – Jherico

+1

Да, но тогда ты все еще помогал ему. это очень здорово. вы, наверное, больше задумывались над своей домашней работой, чем у него (суровая, извините). –