2015-11-08 57 views
0

我试图在每次循环结束时打印歌曲名称和歌曲长度。我该怎么做呢? Report+= songTitles[numSongs] + songLengths[numSongs]打印数组中的值列表

然后,我需要做一个线性搜索从播放列表中删除歌曲。我是否需要使用相同的报告字符串让用户看到所有歌曲?我只需要帮助。谢谢。

import javax.swing.JOptionPane; 

public class asdf_Playlist { 

    public static void main(String[] args) { 

    final int MAX_SONGS = 106; 
    int totalDuration = 0; 
    int numSongs = 0; 
    boolean exitVar = false; 
    int i = 0; 

    String[] songTitles = new String[MAX_SONGS]; 
    int[] songLengths = new int[MAX_SONGS]; 

    while (exitVar == false && numSongs <= songTitles.length) { 

     do { 

     songTitles[numSongs] = JOptionPane.showInputDialog(null,"Enter a song name, or type -1 to exit"); 
     if (songTitles[numSongs].equals("")) { 
      JOptionPane.showMessageDialog(null,"Error: Please enter a valid song name, or type -1 to exit"); 
     } else if (songTitles[numSongs].equals("-1")) { 
      exitVar = true; 
     } 
     } while (songTitles[numSongs].equals("")); 


     do { 
     try { 
      songLengths[numSongs] = Integer.parseInt(JOptionPane.showInputDialog(null,"Enter a song length, e.g. 4.")); 
      if (songLengths[numSongs] > 0) { 
      totalDuration += songLengths[numSongs]; 
      } else { 
      songLengths[numSongs] = -1; 
      JOptionPane.showMessageDialog(null,"Error: please enter a valid song length, e.g. 4."); 
      } 
     } catch (NumberFormatException e) { 
      songLengths[numSongs] = -1; 
      JOptionPane.showMessageDialog(null, "Error: please enter a valid song length, e.g. 4."); 
     } 

     } while (songLengths[numSongs] <= 0); 



     boolean addMore = true; 

     while ((numSongs <= MAX_SONGS) && (addMore == true)) { 
     JOptionPane.showMessageDialog(null, "Song #" + (i+1) + ": " + songTitles[i] + " length: " + songLengths[i] + "\n"); 
     i++; 
     if (songTitles[i] == null) { 
      addMore = false; 
     } 
     } 
     numSongs++; 
    } 
    } 
} 
+2

目前还不清楚你在问什么。你的意思是打印到控制台或文件?您是否想要为循环的每次迭代打印所有歌曲?你问题中的“报告”是指什么? – sprinter

+0

抱歉 - 我只是想在每次循环重新开始时打印歌曲标题和长度,以便用户可以看到他们输入的每首歌曲。这就是我想要做的。 – Hello

+0

我还需要使用线性搜索删除歌曲,我想我可以使用带有报告标题的字符串(类似于“歌曲名称:,歌曲长度:”)来显示所有歌曲,以便用户可以键入将歌曲从列表中删除的名称。 我刚才发现我可以使用连接并拾取之前输入信息的字符串,因此用户可以看到输入的每首歌曲,而不仅仅是前一首。 – Hello

回答

0

我有几点建议可以让你更容易。

首先,你应该创建一个类来捕捉你的歌曲信息,而不是有两个单独的数组。从长远来看,这会让你的生活变得更容易(而且是更好的OO练习)。然后,您可以创建一个toString方法作为类的一部分来格式化歌曲信息:

class Song { 
    private final String title; 
    private final int length; 

    public String toString() { 
     return title + ":" + length; 
    } 
} 

你的歌阵列,然后变得更简单:

private Song[] songs = new Song[MAX_SONGS]; 

打印整个列表可以通过多种方式来实现。 Java的8之前,一般会是这个样子:

for (Song song: songs) 
    System.out.println(song); 

由于Java 8发布这可以简化为:从数组

Arrays.stream(songs).forEach(System.out::println); 

删除项目并不像从集合删除它们一样简单。但它仍然不是太难:

Song[] copy = new Song[MAX_SONGS]; 
int copiedSongs = 0; 
for (Song song: songs) 
    if (/* condition for copying */) 
     copy[copiedSongs++] = song; 
songs = copy; 
numSongs = copiedSongs; 

同样,使用Java 8这已成为更简单:

songs = Arrays.stream(songs).filter(/*condition*/).toArray(); 
numSongs = songs.length;