جافا نوعا مجموعة سلسلة أسماء الملفات التي امتدادها

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

سؤال

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

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

المحلول

Arrays.sort(filenames, new Comparator<String>() {
    @Override
    public int compare(String s1, String s2) {
        // the +1 is to avoid including the '.' in the extension and to avoid exceptions
        // EDIT:
        // We first need to make sure that either both files or neither file
        // has an extension (otherwise we'll end up comparing the extension of one
        // to the start of the other, or else throwing an exception)
        final int s1Dot = s1.lastIndexOf('.');
        final int s2Dot = s2.lastIndexOf('.');
        if ((s1Dot == -1) == (s2Dot == -1)) { // both or neither
            s1 = s1.substring(s1Dot + 1);
            s2 = s2.substring(s2Dot + 1);
            return s1.compareTo(s2);
        } else if (s1Dot == -1) { // only s2 has an extension, so s1 goes first
            return -1;
        } else { // only s1 has an extension, so s1 goes second
            return 1;
        }
    }
});

لاكتمال: java.util.Arrays و < وأ href = "http://java.sun.com/javase/6/docs/api/java/util/Comparator.html" يختلط = "noreferrer"> java.util.Comparator .

نصائح أخرى

إذا كنت أتذكر بشكل صحيح، وArrays.sort (...) يأخذ المقارنة <> أنها سوف تستخدم للقيام الفرز. يمكنك توفير تنفيذ ذلك الذي يبدو في الجزء تمديد السلسلة.

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

وعلى سبيل المثال

import java.util.Arrays;
import java.util.TreeMap;

public class Bar {

    public static void main(String[] args) {
        TreeMap<String, String> m2 = new TreeMap<String, String>();
        for (String string : Arrays.asList(new String[] { "#3", "#2", "#1" })) {
            String key = string.substring(string.length() - 1);
            String value = string;
            m2.put(key, value);
        }
        System.out.println(m2.values());
    }
}

وبطباعة

[#1, #2, #3]

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

وهذا يحسب فقط مفتاح مرة واحدة لكل إدخال، وبالتالي O (ن) - (ولكن هذا النوع لا يزال O (ن سجل ن)). إذا كان حساب رئيسي مكلف أو ن كبير وهذا قد يكون قياسه تماما.

    String DELIMETER = File.separator + ".";
    List<String> orginalList = new CopyOnWriteArrayList<>(Arrays.asList(listOfFileNames));
    Set<String> setOfuniqueExtension = new TreeSet<>();

    for (String item : listOfFileNames) {
        if (item.contains(".")) {
            String[] split = item.split(DELIMETER);
            String temp = "." + split[split.length - 1];
            setOfuniqueExtension.add(temp);
        }
    }

    List<String> finalListOfAllFiles = new LinkedList<>();
    setOfuniqueExtension.stream().forEach((s1) -> {
        for (int i = 0; i < orginalList.size(); i++) {
            if (orginalList.get(i).contains(s1)) {
                finalListOfAllFiles.add(orginalList.get(i));
                orginalList.remove(orginalList.get(i));
                i--;
            }
        }
    });

    orginalList.stream().filter((s1) -> (!finalListOfAllFiles.contains(s1))).forEach((s1) -> {
        finalListOfAllFiles.add(s1);
    });

    return finalListOfAllFiles;

إذا كنت ترغب فقط في مجموعة الملفات عن طريق توسيع نطاقها ولا يهتمون الترتيب الأبجدي الفعلي، يمكنك استخدام هذا:

وأعتقد أن أبسط شيء يمكنك القيام به أن يعمل أيضا عندما لا يكون لfilenname و"." هو فقط عكس الأسماء ومقارنتها.

Arrays.sort(ary, new Comparator<String>() {
    @Override
    public int compare(String o1, String o2) {
        String r1 = new StringBuffer(o1).reverse().toString();
        String r2 = new StringBuffer(o2).reverse().toString();
        return r1.compareTo(r2);
    }
});

ومن العار أن سلسلة جافا وليس لديها حتى العكس ().

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