如何使用增强的for循环迭代两个List对象

时间:2014-09-30 05:03:56

标签: java loops javafx

我正在尝试使用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次,如果有3个项目。

我想像for (int i = 0, int iL; int iL < l.size(), i < l.size(); iL++, i++) {这样的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) {

            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 ll.add("C:/Users/Public/Pictures/Sample Pictures/Desert.jpg");中的每个链接都有一个图像。存在与链接一样多的图像,因此有两个循环。外部循环for (final String imageResource : l) {获取链接,内部循环for (int i = 0; i < l.size(); i++) {创建可点击的图像,单击该图像时会打开资源,视频,图片或音乐文件。

2 个答案:

答案 0 :(得分:0)

我假设您正在尝试加载文件名在列表l中的图片。这意味着您只需要一个for循环。

答案 1 :(得分:0)

你可以这样做:

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)访问你的链接 第一个循环正在做的只是将List的内容分配给最终的String imageResource,然后将在您的代码中使用: if (imageResource.startsWith("file:")) { absolutePath = absolutePath.replace("\\standAloneDev\\java\\workingDir\\live\\WakiliProject\\file:D:", ""); } 因此,为了使其高效,您可以做的是删除第一个循环,而不是使用imageResource作为条件运算符,您可以使用l.get(i)代替。您无需通过第一个循环将其分配给String变量。 希望这能回答你的问题