كيف يمكنني تشكيل قائمة مرتبة من القيم المستخرجة من HashMap؟

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

  •  03-07-2019
  •  | 
  •  

سؤال

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

ولدي HashMap<String, File> من الأشياء File كقيم. وString name مفاتيح المجالات التي هي جزء من الحالات File. ولست بحاجة إلى تكرار عبر القيم في HashMap وإعادتها كما String احد.

وهذا ما لدي حاليا:

private String getFiles()
{   
    Collection<File> fileCollection = files.values();
    StringBuilder allFilesString = new StringBuilder();

    for(File file : fileCollection) {
        allFilesString.append(file.toString());
    }
    return allFilesString.toString();
}

وهذا لا وظيفة، ولكن من الناحية المثالية أريد القيم File منفصلة ليتم إلحاق StringBuilder في ترتيب int fileID، وهو مجال الطبقة File.

والأمل لقد جعل ذلك واضحا بما فيه الكفاية.

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

المحلول

وشيء من هذا القبيل يجب أن تعمل:

List<File> fileCollection = new ArrayList<File>(files.values());

Collections.sort(fileCollection, 
                 new Comparator<File>() 
                 {
                     public int compare(File fileA, File fileB) 
                     {
                         final int retVal;

                         if(fileA.fileID > fileB.fileID)
                         {
                             retVal = 1;
                         }
                         else if(fileA.fileID < fileB.fileID)
                         {
                             retVal = -1;
                         }
                         else
                         {
                             retVal = 0;
                         }

                         return (retVal);                         
                     }
                 });

نصائح أخرى

للأسف لا توجد طريقة للحصول على بيانات من أصل HashMap في أي أمر يمكن التعرف عليه. عليك إما وضع كل القيم إلى TreeSet مع المقارنة يستخدم fileID، أو وضعها إلى ArrayList وفرزها مع Collections.sort، مرة أخرى مع المقارنة أن يقارن بالطريقة التي تريدها.

ولا يعمل طريقة TreeSet إذا كان هناك أي التكرارات، وأنه قد يكون مبالغة منذ كنت لن يتم إضافة أشياء أو إزالة الأشياء من المجموعة. طريقة Collections.sort هو حل جيد لمثل هذه الحالات حيث كنت ذاهب الى اتخاذ HashSet كله، فرز النتائج، ومن ثم إرم بعيدا جمع فرزها في أقرب وقت كنت قد ولدت نتيجة.

وموافق، وهذا هو ما جئت به. يبدو أن حل المشكلة، بإرجاع سلسلة مع ملف الكائنات أمر جيد من قبل fileId بهم.

public String getFiles()
{   
    List<File> fileList = new ArrayList<File>(files.values());

    Collections.sort(fileList, new Comparator<File>()
                               {
                                   public int compare(File fileA, File fileB)
                                   {
                                       if(fileA.getFileId() > fileB.getFileId()) 
                                       {
                                           return 1;
                                       }
                                       else if(fileA.getFileId() < fileB.getFileId()) 
                                       {
                                           return -1;
                                       }
                                       return 0;
                                   }
                               });

    StringBuilder allFilesString = new StringBuilder();

    for(File file : fileList) {
        allFilesString.append(file.toString());
    }
    return allFilesString.toString();
}

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

لماذا لا أنه جمع في صفيف، النوع، ثم سلسلة ذلك؟

و- MarkusQ

وسيكون لديك لإضافة القيم الخاصة بك () جمع إلى ArrayList وفرز باستخدام Collections.sort () مع مثيل المقارنة المخصص قبل بالتكرار أكثر من ذلك.

وراجع للشغل، لاحظ أن من غير المجدي لتهيئة StringBuffer مع حجم المجموعة، لأنك سوف تكون إضافة أكثر من 1 شخصية لكل عنصر جمع.

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

وهنا هو الأسلوب كنت تبحث عن: <لأ href = "http://java.sun.com/javase/6/docs/api/java/util/Collections.html#sort(java.util. قائمة،٪ 20java.util.Comparator) "يختلط =" نوفولو noreferrer "> http://java.sun.com/javase/6/docs/api/java/util/Collections.html#sort (java.util.List ،٪ 20java.util.Comparator)

وأنا خلقت LinkedHashMap عشرات المرات قبل إضافته إلى مجموعة من المجموعات.

وماذا ربما كنت ترغب في القيام به هو إنشاء مجموعة TreeHashMap.

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

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

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

StringBuffer allFilesString = new StringBuffer(fileCollection.size());

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

وإزالة لزوم لها قرأه if.

List<File> fileCollection = new ArrayList<File>(files.values());
Collections.sort(fileCollection, 
             new Comparator<File>() {
                 public int compare(File a, File b) {
                     return (a.fileID - b.fileID);
                 }
             });
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top