جافا فرز سريع، والقراءة من ملف إدخال المستخدم إلى أي صفيف (ليتم فرزها)

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

  •  18-09-2019
  •  | 
  •  

سؤال

ما الأمر،

أحاول كتابة بعض الكود في جافا التي ستقرأ في الأرقام من ملف (واحد # في كل سطر ملف .txt) وضعها في صفيف، ثم قم بتشغيل الفرز السريع على الصفيف. يظهر الكسوف بعض اللون الأحمر الذي أواجه مشكلة معه. أخطائري تتميز بتعليقات، وما الخطأ هو، إذا كان بإمكان أي شخص أن يساعدني في الركض، شكرا للجميع!

نسل

حسنا، لقد قمت بتحديث أول إجابتين، شكرا حتى الآن، ولكن أخطيتين آخرين لا أفهمهما حقا.

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);
        }
    }
هل كانت مفيدة؟

المحلول

بعض الأخطاء:

  • public testScan1(String filename) في الواقع ليس لديها أي نوع عودة ويتم استدعاء أيضا من سياق ثابت ولكنه ليس ثابتا. يجب أن يتغير إلى public static void testScan1(String filename).
  • ما هو الغرض من file.hasNext()ب بالطبع غير موجود لأنه لا يعني أي شيء. أعتقد أنك تعني scan.hasNext().
  • array لا يمكن العثور عليها لأنه محدد داخل try/catch كتلة لذلك حاضر فقط داخل هذا النطاق. حرك التعريف قبل المحاولة.

بالإضافة إلى ذلك، حاول تحديد رمز المسافة البادئة بطريقة أكثر قابلية للقراءة، مما يجعل من الصعب العثور على أخطاء حقا. على سبيل المثال لماذا هناك حامل } قبل دعوة testScan التي تندرج من الطريقة الرئيسية التي أفترض أنك تريد أن تسميها؟

نصائح أخرى

في أي وقت تتعامل مع خوارزمية متكررة وتحصل على تجاوز سعة مكدس، لأن الخوارزمية الخاصة بك لا تحتوي على حقيبة حافة محددة بوضوح تتسبب في إنهاء العودية. (أو مدخلاتك كبيرة جدا، ولكن هذا نادرا ما يكون الحال، وليس هو الحال هنا.)

يجب أن ننظر إلى الخاص بك quickSort() طريقة لمعرفة ما قد يجعلها تسمي نفسه بلا حدود. فكر في النظر في انعكاس مع اثنين من المرايا، حيث يرتد الانعكاس من التفكير الآخر ويخرج إلى ما لا نهاية ... هذا ما يحدث هنا.

أيضا، في لغة Java، يوصى دائما ببدء اسم الفصل الخاص بك بحرف كبير. أود أن اسم صفك QuickSortHomework أو شيء من هذا القبيل.

بالإضافة إلى ذلك، قد ترغب في قراءة كيفية if يعمل البيان في جافا، وكيف يتم تعريف "كتل". انت تملك if بيان بالقرب من فاصلة منقوطة وزوج من الأقواس المجعد التي ربما لا تفعل ما تعتقد أنه يفعله.

بصراحة، أحصل على نوع من الإزعاج في جميع عمليات إعادة النشر والأحرف هنا.

هذا ليس ما تريد أن تسمعه، لكنني أشعر أنك تستخدم هذا الموقع كعكاز. لا يبدو أنك تضع في وقت اللغز بنفسك ما يحدث. تلك العملية المحيرة، بغض النظر عن مدى المؤلم، حيث يأتي التعلم الحقيقي من.

في هذه الحالة، إذا نظرت إلى ما يعنيه هذا الخطأ، ثم نظرت للتو إلى تطبيق QuickSort () الخاص بك، أعتقد أنك سيتعين عليك أن تلاحظ أنه هناك خطأ واضح في ذلك.

تحرير: إذا كنت تفكر "لكنني فعل حاول أن تحل محلها "... إنها تساعد حقا في تضمينها في مشاركتك،" اعتقدت أنه قد يكون هذا، لكن ذلك لم ينجح، لذلك فكرت ربما يمكن أن يكون .... "إلخ. نصف الوقت ستحقق فجأة المشكلة بينما كنت تحاول التحدث عن طريق ذلك مثل هذا. النصف الآخر، على الأقل نرى أنك تحاول.

كما قلت لك في صفيف السؤال السابق لا يمكن العثور عليه لأنه لا يزال في محاولة المحاولة.

ثم للطباعة، لا يمكنك طباعة صفيف مباشرة بطريقة مفيدة، يجب عليك تكرار كل عنصر وطباعتها بالطريقة التالية:

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

انظروا كيف يساعد البحث في رمز القراءة ..

مشكلتك هي أن TESTSCAN1 يحتاج إلى نوع الإرجاع، حتى لو كان هذا النوع باطلا.

IIRC، لا أعتقد أنه يمكنك طباعة صفيف ورؤية كل القيم، كما يمكنك في Python أو Scala. سيكون عليك حلقة من خلال مجموعة لطباعة القيم:

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

لديك اثنين من المشاكل. تحتاج إلى تحديد صفيفك خارج كتلة المحاولة. مثله:

 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 طريقة).

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top