문제

파일 이름 배열이 있고 파일 이름 확장자를 기준으로 해당 배열을 정렬해야 합니다.이를 수행하는 쉬운 방법이 있습니까?

도움이 되었습니까?

해결책

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 그리고 java.util.Comparator.

다른 팁

내가 올바르게 기억한다면, 배열 (...)은 비교기 <>를 사용하여 정렬을 수행하는 데 사용할 것입니다. 문자열의 확장 부분을 보는 구현을 제공 할 수 있습니다.

사용자 정의를 구현할 수 있습니다 비교기 문자열의. 마지막 지수 이후 하위 문자로 분류하십시오. '.'. 그런 다음 비교기와 배열을 전달하십시오

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(n log n)을 의미하는 모든 비교에 대해 생성되어야 합니다.또 다른 접근 방식은 정렬해야 하는 각 항목에 대해 (키, 값) 쌍을 만들고 이를 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(n) - (그러나 정렬은 여전히 ​​O(n log n)입니다).키 계산이 비싸거나 n이 큰 경우 이는 상당히 측정 가능합니다.

비교기를 만들고 문자열 확장을 비교하십시오. 다음을 살펴보십시오

http://java.sun.com/j2se/1.4.2/docs/api/java/util/comparator.html

그런 다음 문자열 목록을 배열로 전달합니다 .SORT (목록, 비교기)

직접 만들어 봐 비교기 그것은 문자열을 파일 이름으로 취급하고 확장자를 기반으로 비교합니다. 그런 다음 사용하십시오 배열 .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;

확장자로 파일을 그룹화하고 실제 알파벳 순서에 신경 쓰지 않으려면 다음을 사용할 수 있습니다.

파일 이름에 ""가 없을 때 가장 간단한 일이 작동한다고 생각합니다. 이름을 되돌리고 비교하는 것입니다.

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);
    }
});

Java의 줄이 리버스 ()도 가지고 있지 않다는 것은 부끄러운 일입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top