كيف يمكنني فرز هذه الصورة عن الطريقة التي أريدها؟

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

  •  23-08-2019
  •  | 
  •  

سؤال

فيما يلي برنامج فرز بسيط لقائمة صفيف:

ArrayList<String> list = new ArrayList<String>();

list.add("1_Update");
list.add("11_Add");
list.add("12_Delete");
list.add("2_Create");

Collections.sort(list);
for (String str : list) {
  System.out.println(str.toString());
}

كنت أتوقع إنتاج هذا البرنامج على النحو التالي:

1_Update
2_Create
11_Add
12_Delete

ولكن عندما أدى هذا البرنامج، أحصل على الإخراج على النحو التالي:

11_Add
12_Delete
1_Update
2_Create

لماذا هذا وكيف يمكنني الحصول على قائمة الصفيف للفرز كما هو موضح في الإخراج المتوقع؟

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

المحلول

يمكنك كتابة مقارنة مخصص:

Collections.sort(list, new Comparator<String>() {
    public int compare(String a, String b) {
        return Integer.signum(fixString(a) - fixString(b));
    }
    private int fixString(String in) {
        return Integer.parseInt(in.substring(0, in.indexOf('_')));
    }
});

نصائح أخرى

عند فرز هذا النوع من البيانات كسلسلة، فإنه يقارن الأحرف نفسها، بما في ذلك الأرقام. كل السلسلة التي تبدأ ب "1"، على سبيل المثال، ستنتهي معا. لذلك ينتهي الطلب مشابه لهذا ...

1 10 100 2 20 200

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

001 002 010 020 100 200

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

إنه يقوم بمقارنة معجمية. يقارن الحرف الأول في كل سلسلة فرزها. ثم يقارن السلسلة الثانية من أولئك الذين لديهم نفس Charater الأول. عندما يقارن الحرف "_" إلى رقم، فمن القيمة أكبر من أي حرف رقم واحد تماما مثل 8> 7 و A> 9. تذكر أنه يقوم بمقارنة شخصية وليس مقارنة رقمية.

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

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

01_create_table.sql 02_create_index.sql 11_assign_privileges.sql.

عن طريق الحفاظ على أول رقمين الخاص بك إلى حرفين، ستعمل المقارنة المعجمية.

تقول مستندات المواصفات ()

فرز القائمة المحددة في ترتيب تصاعدي، وفقا للترتيب الطبيعي لعناصرها.

مما يعني الحصول على القائم بأسلوتات في الترتيب الأبجدي. تأتي السلسلة 11_assign_privileges.sql قبل سلسلة 1_create_table.sql و 12_07_insert_static_data.sql تأتي قبل 1_create_table.sql إلخ. لذلك يعمل البرنامج كما هو متوقع.

نظرا لأن الأوتار يتم فرزها في ترتيب أبجديي وشخصية الشرطة السفلية بعد الأحرف للأرقام. يجب عليك توفير تنفيذ مقارنة "أمر طبيعي" لتحقيق النتيجة المرجوة.

سلسلة مقارنة الخوارزمية قارن كل حرف في الوقت. 1 أنواع من قبل 2. وبعد لا يهم أنه يتبعه 1 أو أ 2.

وبالتالي 100 سوف فرز قبل 2. وبعد إذا كنت لا تريد هذا السلوك، فأنت بحاجة إلى خوارزمية مقارنة تعالج هذه الحالة.

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

للحصول على Collection.Sort () فرز بشكل تعسفي يمكنك استخدامه

Collections.sort(List list, Comparator c)  

ثم قم ببساطة بتنفيذ المقارنة التي تقسم السلسلة والفرز أولا بناء على الرقم ثم في البقية أو مع ذلك تريد ذلك للفرز.

لقد أشار الجميع بالفعل إلى أن التفسير هو أن سلاسلك هي فرز كسلاسل، وكان عدد قد وجه بالفعل انتباهكم إلى مقارنة سلسلة النظام الطبيعي. سأضيف فقط أنه تمرين رائع لكتابة ذلك المقارنة بنفسك، وفرصة عظيمة لممارسة التنمية التي يحركها الاختبار. لقد استخدمتها لإظهار TDD في Code Camp؛ الشرائح والرمز هي هنا.

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

ملاحظة كيف يتم فرز قائمة الصفيف حسب خاصية اسم العناصر. إذا لم تقم بإضافة الصيغة المثالية، فعندئذ عند استخدام طريقة الترتيب، ستقوم بإلقاء خطأ.

enter image description here

static void Main(string[] args)
    {
        ArrayList items = new ArrayList();
        items.Add(new Item("book", 12.32));
        items.Add(new Item("cd", 16.32));
        items.Add(new Item("bed", 124.2));
        items.Add(new Item("TV", 12.32));

        items.Sort();

        foreach (Item temp in items)
            Console.WriteLine("Name:{0} Price:{1}", temp.name, temp.price);
        Console.Read();            
    }


    class Item: IComparable
    {
        public string name;
        public double price;

        public Item(string _name, double _price)
        {
            this.name = _name;
            this.price = _price;
        }

        public int CompareTo(object obj)
        {   
            //note that I use the name property I may use a different one
            int temp = this.name.CompareTo(((Item)obj).name);
            return temp;
        }
    }

كما هو مذكور أعلاه، فأنت تبحث عن تنفيذ مقارنة ينفذ نوعا طبيعيا. كتب جيف اتوود ممتاز المشاركة على الفرز الطبيعي منذ بعض الوقت - إنه يستحق القراءة.

إذا كنت تبحث عن تطبيق جافا، فقد وجدت أن هذا هو مفيد:http://www.davekoelle.com/alphanum.html.

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