Проблемы со списком массивов

#java #arraylist

#java #arraylist

Вопрос:

Мне было интересно, как ссылаться на ArrayList на метод, отличный от того, в котором он был объявлен. Например, я пишу программу, которая позволяет мне создавать список воспроизведения песен, поэтому в одном методе у меня есть createAPlaylist, а затем в другом методе у меня есть shuffle(). В моем методе воспроизведения я создал ArrayList, но у меня возникли проблемы с использованием этого ArrayList в моем методе shuffle. Ниже приведен некоторый код для контекста:

 public static void createAPlaylist() {
        try {
            System.out.println("We have the following tracks:");
            ArrayList<String> songs = new ArrayList<String>();
            String firstSong = jukebox.allTracks.get(0).getTitle();
            songs.add(firstSong);

            for (int index = 0; index < count; index  ) {
                System.out.println(SPACES   (index   1)   ". "   jukebox.allTracks.get(index).getTitle());
            }

            System.out.println("Select a track to add to the playlist: ");
            int songNumber = input.nextInt();
            String songSelected = songs.get(songNumber);
            songs.add(songSelected);
            input.nextLine();
            

        } catch (Exception e) {
            System.out.println("nplease select a valid song number.");
        }
    }
 

Комментарии:

1. Не перехватывайте подобные исключения. Вы перехватываете все исключения, включая RuntimeException s, такие как NullPointerException s, ArrayIndexOutOfBoundsException s и NoSuchElementException s. Это означает, что вы скрываете причину исключения, просто печатая «пожалуйста, выберите допустимый номер песни». Это затруднит отладку ошибок в вашем коде.

2. В идеале вы должны создать createAPlaylist() функцию для возврата списка объектов, а затем передать его shuffle(List<Song> musicList) функции.

3. Вы хотите узнать, что такое «область видимости». Переменные видны только в той области, в которой они определены. Вы объявляете список внутри блока try, поэтому он виден / известен только в этом блоке. Это просто.

Ответ №1:

Для этого и нужны параметры метода:

 public static void createAPlaylist() {
    ArrayList<String> songs = new ArrayList<>();
    shuffle(songs);
}

public static void shuffle(ArrayList<String> songs) {
    // Do stuff with your ArrayList here
}
 

Комментарии:

1. Для записи: static может быть опущен, поскольку мы не знаем, что weather Author реализует в Main.java досье.

2. Плохой совет. Когда этот метод «заканчивается», список воспроизведения по-прежнему «пропал». Вы решили только половину проблемы с OPs.

Ответ №2:

Вы можете получить arraylist из createAPlaylist метода и передать его shuffle методу:

Нравится:

  public static List<String> createAPlaylist() {
  ...
  ...
  ... 
  return songs;
 }

/// and then in shuffle method receive that as parameter :

public static void shuffle(List<String> songs){
    // access that songs list by
}
 

Или вы могли бы:

Вместо переменной метода объявите этот arraylist как переменную класса..

Нравится:

 public class ClassName{
 public static ArrayList<String> songs = new ArrayList<String>();
 
 public static void createAPlaylist() {
  ...
  ...
  ... 
  // reset the songs.
  songs = new ArrayList<String>();
  ...
 }

/// and then in another method:

public static void suffle(){
    // access that songs list by
   List<String> createdSongs = ClassName.songs;
}
 

Ответ №3:

В Java переменные доступны только в контексте, в котором они созданы, поэтому, если вы создаете ArrayList внутри метода, вы не сможете получить к нему доступ за пределами этого метода, если вы не сохраните его в классе метода или не вернете переменную из метода, который она создала.

Вы можете либо объявить ArrayList внешнюю часть метода как поле класса, например:

 public class Foo {

    private static ArrayList<String> arrayList = new ArrayList<String>();

    public static void createAPlaylist() {
        arrayList.add();

        etc...
    }
}
 

Или вы могли бы вернуть ArrayList из метода следующим образом:

 public class Foo {
    public static void main(String[] args) {
        ArrayList<String> arrayList = createAPlaylist();
    }

    public static ArrayList<String> createAPlaylist() {

    ArrayList<String> songs = new ArrayList<String>();

    // Your code here

    // Note that you have to return the list from 
    // inside the catch block!


    // I’d recommend creating the ‘songs’ ArrayList 
    // outside of the ‘try’ block, so that you can 
    // have a fallback if something fails in the ‘try’

    return songs;
    }
}
 

Я не знаю, хотите ли вы, чтобы все это было статичным. Я бы подумал, что он будет работать лучше как нестатический, но это вопрос для другого вопроса, поэтому я оставил его как есть в примерах.

Извините, если это не отформатировано идеально — я нахожусь на мобильном устройстве, и у меня нет IDE.