-1

ムービーを作成できるように、フォルダーから一連の JPG ファイルを取得する必要があります。問題は、ファイルがでたらめな方法でリストされているため、でたらめな方法で処理されることです。スクリーンショットは次のとおりです。
ここに画像の説明を入力

img0,img1.....imgn のように連続して必要
です。どうすればよいですか?
**カスタムの並べ替えスキームを開発しましたが、例外が発生します。コーディングは次のとおりです。

try{
                int totalImages = 0;
                int requiredImage = 0;
                jpegFiles = Files.newDirectoryStream(Paths.get(pathToPass).getParent(), "*.JPG");
                Iterator it = jpegFiles.iterator();
                Iterator it2 = jpegFiles.iterator();
                Iterator it3 = jpegFiles.iterator();
                while(it.hasNext()){
                    it.next();
                    totalImages++;
                }
                System.out.println(totalImages);
                sortedJpegFiles = new String[totalImages];
                while(it2.hasNext()){
                    Path jpegFile = (Path)it2.next();
                    String name = jpegFile.getFileName().toString();
                    int index = name.indexOf(Integer.toString(requiredImage));
                    if(index!=-1){
                        sortedJpegFiles[requiredImage] = jpegFile.toString();
                    }
                    requiredImage++;
                }
                for(String print : sortedJpegFiles){
                    System.out.println(print);
                }

            }catch(IOException e){
                e.printStackTrace();  
            }  

例外:

Exception in thread "AWT-EventQueue-0" java.lang.IllegalStateException: Iterator already obtained
    at sun.nio.fs.WindowsDirectoryStream.iterator(Unknown Source)
    at ScreenshotDemo.SCapGUI$VideoCreator.run(SCapGUI.java:186)
    at ScreenshotDemo.SCapGUI$1.windowClosing(SCapGUI.java:30)
    at java.awt.Window.processWindowEvent(Unknown Source)
    at javax.swing.JFrame.processWindowEvent(Unknown Source)
    at java.awt.Window.processEvent(Unknown Source)
    at java.awt.Component.dispatchEventImpl(Unknown Source)
    at java.awt.Container.dispatchEventImpl(Unknown Source)
    at java.awt.Window.dispatchEventImpl(Unknown Source)
    at java.awt.Component.dispatchEvent(Unknown Source)
    at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
    at java.awt.EventQueue.access$200(Unknown Source)
    at java.awt.EventQueue$3.run(Unknown Source)
    at java.awt.EventQueue$3.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
    at java.awt.EventQueue$4.run(Unknown Source)
    at java.awt.EventQueue$4.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
    at java.awt.EventQueue.dispatchEvent(Unknown Source)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.run(Unknown Source)
4

2 に答える 2

3

カスタムコンパレータ

おそらく正規表現を使用して数値部分を抽出し、それを使用して並べ替える必要があります。カスタムComparatorは、カスタム数値比較をカプセル化する場合があります。

import java.util.*;
import java.util.regex.*;

// Sort strings by last integer number contained in string.
class CompareByLastNumber implements Comparator<String> {
    private static Pattern re = Pattern.compile("[0-9]+");
    public boolean equals(Object obj) {
        return obj != null && obj.getClass().equals(getClass());
    }
    private int num(String s) {
        int res = -1;
        Matcher m = re.matcher(s);
        while (m.find())
            res = Integer.parseInt(m.group());
        return res;
    }
    public int compare(String a, String b) {
        return num(a) - num(b);
    }
    public static void main(String[] args) {
        Arrays.sort(args, new CompareByLastNumber());
        for (String s: args)
            System.out.println(s);
    }
}

回避するIllegalStateException

更新された質問を参照してください。発生する例外は、DirectoryStream複数回反復しようとしたためです。その参照からの引用:

DirectoryStream拡張しますが、単一の;のみをサポートするIterableため、汎用ではありません。イテレータメソッドを呼び出して、2番目以降のイテレータスローを取得します。IterableIteratorIllegalStateException

したがって、表示される動作は予想されるものです。すべてのファイルを1つのリストにまとめる必要があります。これらの線に沿った何か:

List<Path> jpegFilesList = new ArrayList<>();
while (Path p: jpegFiles)
  jpegFilesList.add(p);
sortedJpegFiles = new String[jpegFilesList.size()];
for(Path jpegFile: jpegFilesList) {
  …
}

IllegalStateExceptionに関するこの問題は、元の質問とはかなり異なることに注意してください。したがって、別の質問にしたほうがよいでしょう。SOはフォーラムではないことを忘れないでください。したがって、質問ごとに1つの問題に固執してください。

于 2012-09-13T18:59:39.827 に答える
1

ファイルは辞書式順序で並べられています。これは人間には不自然に見えるかもしれませんが、コンピューターにとっては完全に論理的です。
自分で並べ替えたくない場合は、「人間の論理」に従って並べ替えるアルゴリズムがいくつかあります。その1つの例が英数字アルゴリズムです。

于 2012-09-13T18:59:59.507 に答える