- ترتيب الأسماء المدخلة من قبل المستخدم ترتيباً أبجدياً حسب الاسم الأخير

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

سؤال

لقد أكملت معظم التعليمات البرمجية بنفسي (بمساعدة القليل من البحث على Google) ولكني واجهت مشكلة غير متوقعة.أولاً، لا بد لي من فرز قائمة الأسماء التي أدخلها المستخدم بترتيب أبجدي لأسمائهم الأخيرة باستخدام الفرز بالاختيار.هنا هو الكود الخاص بي:

    import java.util.*;
class Name_Sort
{
    public static void main (String args[])
    {
        Scanner in = new Scanner (System.in);
        System.out.print ("Enter the number of names you wish to enter: ");
        int n = in.nextInt();
        String ar[] = new String [n];
        for (int i = 0; i<ar.length; i++)
        {
            System.out.print("Please enter the name: ");
            ar[i]= in.nextLine();
        }
        String temp;
        for (int b = 0; b<n; b++)
        {
            for (int j=b+1; j<n; j++)
            {
                if ((compareLastNames(ar[b], ar[j]))>0)
                {
                    temp = ar[b];
                    ar[b] = ar[j];
                    ar[j] = temp;
                }
            }
        }
        System.out.println ("The names sorted in alphabetical order are: ");
        for (int a = 0; a<n; a++)
            System.out.print (ar[a]+"\t");
    }

    private static int compareLastNames(String a, String b) 
    {
        int index_a = a.lastIndexOf(" ");
        String surname_a = a.substring(index_a);
        int index_b = b.lastIndexOf(" ");
        String surname_b = b.substring(index_b);
        int lastNameCmp = surname_a.compareToIgnoreCase(surname_b);
        return lastNameCmp;
    }
}

المشكلة (على ما أعتقد) تنشأ عندما آخذ الأسماء من المستخدم، على وجه التحديد، هذا الجزء:

Scanner in = new Scanner (System.in);
    System.out.print ("Enter the number of names you wish to enter: ");
    int n = in.nextInt();
    String ar[] = new String [n]; //Array to store the names in.
    for (int i = 0; i<ar.length; i++)
    {
        System.out.println("Please enter the name: ");
        ar[i]= in.nextLine();

    }

يظهر الإخراج على النافذة الطرفية لـ BlueJ على النحو التالي

Name_Sort.main({ });
Enter the number of names you wish to enter: 5
Please enter the name: 
Please enter the name: 

هذا ليس ما يفترض أن يعرضه.ما الذي يمكن أن أفعله بشكل خاطئ؟لقد فكرت في الأمر لفترة من الوقت، ولكن لم يتبادر إلى ذهني شيء.

وحتى إذا قمت بالمضي قدمًا وأدخلت بعض الأسماء على الرغم من الخطأ أعلاه، فسوف أحصل على خطأ آخر في هذا الجزء من الكود الخاص بي هنا:

private static int compareLastNames(String a, String b) 
{
    int index_a = a.lastIndexOf(" ");
    String surname_a = a.substring(index_a);// This is the line the compiler highlights.
    int index_b = b.lastIndexOf(" ");
    String surname_b = b.substring(index_b);
    int lastNameCmp = surname_a.compareToIgnoreCase(surname_b);
    return lastNameCmp;
}

الخطأ هو :

java.lang.StringIndexOutOfBoundsException: String index out of range: -1 (injava.lang.String)

هل هذا يعني أن حرف المسافة البيضاء " " غير موجود؟لكن لماذا؟

هذه لقطة شاشة للنافذة الطرفية:http://imgur.com/l7yf7Xn

الأمر هو أنه إذا قمت فقط بتهيئة المصفوفة بالأسماء أولاً (وعدم أخذ أي مدخلات من المستخدم) فإن الرموز تعمل بشكل جيد وتنتج النتيجة المرجوة.أي مساعدة من فضلك؟

أيضًا، بما أنني أعلم أن بعض الأشخاص هنا مهتمون جدًا بهذا الأمر، نعم، هذه مهمة منزلية، نعم، لقد قمت بتنفيذ كل التعليمات البرمجية بنفسي، لقد بحثت في Google عن كيفية فرز الأسماء بالترتيب الأبجدي لأنني لم أستطع قم بتشفير الفكرة الأصلية التي كانت لدي بالضبط.والذي كان يقارن قيم ASCII لكل حرف من لقبين لمعرفة أيهما يجب أن يأتي أولاً.يحب: if((int) surname1.charAt(0)>(int) surname2.charAt(0)) ثم يجب أن يأتي اللقب 2 قبل اللقب 1، وإلا إذا كان كلاهما لهما نفس الحرف الأول، فاستخدم الحرف الثاني وهكذا.

شكرا لأخذ الوقت لقراءة هذا.

هل كانت مفيدة؟

المحلول

المشكلة هي مع in.nextInt() الأمر يقرأ فقط قيمة int.لذا، عندما تتابع القراءة باستخدام in.nextLine()، تتلقى ملف "\n" مفتاح الادخال.لذا للتغلب على هذا سيتعين عليك إضافة إضافة إضافية in.nextLine() قبل الدخول في الحلقة.أو استخدم آخر scanner.

    int n = in.nextInt();
    String ar[] = new String [n]; //Array to store the names in.

    in.nextLine(); // < --- an extra next Line

    for (int i = 0; i<ar.length; i++)
    {
        System.out.println("Please enter the name: ");
        ar[i]= in.nextLine();

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