جافا نوعا مجموعة سلسلة أسماء الملفات التي امتدادها
سؤال
ولدي مجموعة من أسماء وتحتاج إلى فرز هذا مجموعة من ملحقات من اسم الملف. هل هناك طريقة سهلة للقيام بذلك؟
المحلول
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 (...) يأخذ المقارنة <> أنها سوف تستخدم للقيام الفرز. يمكنك توفير تنفيذ ذلك الذي يبدو في الجزء تمديد السلسلة.
ويمكنك تطبيق مخصص المقارنة أ > من سلاسل. جعله فرزها من قبل فرعية بعد ارتفاع مؤشر الأخير من '.'
. ثم تمر في مقارنة ومجموعة الخاصة بك في
Arrays.sort(stringArray, yourComparator);
// An implementation of the compare method
public int compare(String o1, String o2) {
return o1.substring(o1.lastIndexOf('.')).compareTo(o2.substring(o2.lastIndexOf('.'));
}
ومقارنات وغالبا ما تكون صعبة للحصول على حق تماما، ومفتاح المقارنة يجب أن تكون ولدت لكل المقارنة التي لمعظم خوارزميات الفرز تعني 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 (ن سجل ن)). إذا كان حساب رئيسي مكلف أو ن كبير وهذا قد يكون قياسه تماما.
وإنشاء المقارنة ومقارنة ملحقات السلسلة. نلقي نظرة على ما يلي:
HTTP: //java.sun كوم / J2SE / 1.4.2 / مستندات / المعهد / جافا / UTIL / Comparator.html
وبعد ذلك تمر في قائمة السلاسل إلى Arrays.sort (قائمة، المقارنة)
إنشاء بنفسك rel="nofollow المقارنة أ > أن يعامل السلاسل وأسماء ويقارنها على أساس الملحقات. ثم استخدم Arrays.sort مع حجة المقارنة.
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);
}
});
ومن العار أن سلسلة جافا وليس لديها حتى العكس ().