簡體   English   中英

如何使用增強的for循環迭代兩個List對象

[英]How to iterate two List objects with enhanced for loops

我試圖使用for循環迭代兩個列表,但是迭代次數與每個列表中的項目數一樣多。

    List<String> l = new ArrayList();
    l.add("C:/Users/Public/Pictures/Sample Pictures/Koala.jpg");
    l.add("E:/IMG_1241.mp4");

    Image[] images = new Image[l.size()];
    ImageView[] pics = new ImageView[l.size()];

    for (final String imageResource : l) {

        for (int i = 0; i < l.size(); i++) {

有了以上程序,程序將產生最后4個項目。 如果List<String> l有四個項目,則為16,即4個項目進行4次迭代(如果三個為9個項目)。

我當時在這樣的for循環for (int i = 0, int iL; int iL < l.size(), i < l.size(); iL++, i++) { ,但我不確定它是如何工作的出來。

請幫忙。

完整的程序如下所示:

public class TilePaneExample {

    public javafx.scene.layout.TilePane listItems() {

        List<String> l = new ArrayList();
        l.add("C:/Users/Public/Music/Sample Music/Maid with the Flaxen Hair.mp3");
        l.add("C:/Users/Public/Videos/Sample Videos/Wildlife.wmv");
        l.add("C:/Users/Public/Pictures/Sample Pictures/Koala.jpg");
        l.add("C:/Users/Public/Pictures/Sample Pictures/Desert.jpg");

        // Pane
        javafx.scene.layout.TilePane tilePane = new javafx.scene.layout.TilePane();
        tilePane.setHgap(2);
        tilePane.setVgap(2);
        tilePane.setMinWidth(250);

        Image[] images = new Image[l.size()];
        ImageView[] pics = new ImageView[l.size()];

        for (final String imageResource : l) {

            for (int i = 0; i < l.size(); i++) {

                final String imageResourceItem = l.get(i);
                images[i] = new Image("file:" + "C:/Users/Public/Pictures/Sample Pictures/Lighthouse.jpg");

                pics[i] = new ImageView(images[i]);
                pics[i].setFitWidth(22);
                pics[i].setPreserveRatio(true);
                pics[i].setSmooth(true);

                pics[i].setOnMouseClicked(new EventHandler<MouseEvent>() {
                    @Override
                    public void handle(MouseEvent event) {
                        File f = new File(imageResourceItem);

                        String absolutePath = f.getAbsolutePath();
                        if (imageResource.startsWith("file:")) {
                            absolutePath = absolutePath.replace("\\standAloneDev\\java\\workingDir\\live\\WakiliProject\\file:D:", "");
                        }

                        String ext = FilenameUtils.getExtension(absolutePath);

                        System.out.println("You clicked: " + absolutePath + ". The extension is: " + ext);
                        try {
                            Desktop.getDesktop().open(new File(absolutePath));

                        } catch (IOException ex) {
                            Logger.getLogger(TilePaneExample.class.getName()).log(Level.SEVERE, null, ex);
                        }

                    }
                });
                tilePane.getChildren().add(pics[i]);

            }
        }

        return tilePane;
    }
}

我正在使用Windows 7默認示例文件,因此應該無需太多修改即可工作。 嘗試執行它,您會得到我要完成的事情的圖片。

謝謝。

更新:

該應用程序應這樣工作: List l每個鏈接都有一個圖像,即l.add("C:/Users/Public/Pictures/Sample Pictures/Desert.jpg"); 例如。 圖片和鏈接一樣多,因此有兩個循環。 外層循環, for (final String imageResource : l) {獲取鏈接,內層循環for (int i = 0; i < l.size(); i++) {創建可點擊的圖像,單擊該圖像可打開資源,視頻,圖片或音樂文件。

我假設您正在嘗試加載文件名在列表l 這意味着您只需要一個for循環。

您可以通過以下方式進行操作:

public class TilePaneExample {

public javafx.scene.layout.TilePane listItems() {

    List<String> l = new ArrayList();
    l.add("C:/Users/Public/Music/Sample Music/Maid with the Flaxen Hair.mp3");
    l.add("C:/Users/Public/Videos/Sample Videos/Wildlife.wmv");
    l.add("C:/Users/Public/Pictures/Sample Pictures/Koala.jpg");
    l.add("C:/Users/Public/Pictures/Sample Pictures/Desert.jpg");

    // Pane
    javafx.scene.layout.TilePane tilePane = new javafx.scene.layout.TilePane();
    tilePane.setHgap(2);
    tilePane.setVgap(2);
    tilePane.setMinWidth(250);

    Image[] images = new Image[l.size()];
    ImageView[] pics = new ImageView[l.size()];

    //for (final String imageResource : l) { // removed first loop

        for (int i = 0; i < l.size(); i++) {

            final String imageResourceItem = l.get(i);
            images[i] = new Image("file:" + "C:/Users/Public/Pictures/Sample Pictures/Lighthouse.jpg");

            pics[i] = new ImageView(images[i]);
            pics[i].setFitWidth(22);
            pics[i].setPreserveRatio(true);
            pics[i].setSmooth(true);

            pics[i].setOnMouseClicked(new EventHandler<MouseEvent>() {
                @Override
                public void handle(MouseEvent event) {
                    File f = new File(imageResourceItem);

                    String absolutePath = f.getAbsolutePath();
                    if (l.get(i).startsWith("file:")) { // changed the imageResourceItem into l.get(i)
                        absolutePath = absolutePath.replace("\\standAloneDev\\java\\workingDir\\live\\WakiliProject\\file:D:", "");
                    }

                    String ext = FilenameUtils.getExtension(absolutePath);

                    System.out.println("You clicked: " + absolutePath + ". The extension is: " + ext);
                    try {
                        Desktop.getDesktop().open(new File(absolutePath));

                    } catch (IOException ex) {
                        Logger.getLogger(TilePaneExample.class.getName()).log(Level.SEVERE, null, ex);
                    }

                }
            });
            tilePane.getChildren().add(pics[i]);

        }
    }

    return tilePane;
//}

}

沒有第一個循環,您仍然可以使用以下命令訪問鏈接:l.get(i)第一個循環在做什么,只是將列表的內容分配給最終的String imageResource,然后將其用於代碼中: if (imageResource.startsWith("file:")) { absolutePath = absolutePath.replace("\\\\standAloneDev\\\\java\\\\workingDir\\\\live\\\\WakiliProject\\\\file:D:", ""); } if (imageResource.startsWith("file:")) { absolutePath = absolutePath.replace("\\\\standAloneDev\\\\java\\\\workingDir\\\\live\\\\WakiliProject\\\\file:D:", ""); }因此,提高效率的方法是刪除第一個循環,而不必為條件運算符使用imageResource,而可以使用l.get(i)。 無需通過第一個循環將其分配給String變量。 希望這能回答您的問題

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM