[英]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.