2013-11-29 3 views
1

У меня этот конструктор в класса Music:Удалить объект из массива

protected String Title; 
protected String Autor; 
protected String Type; 
protected int Code; 

public Music (String title, String autor, String type, int code){ 
    this.setTitle(title); 
    this.setAutor(autor); 
    this.setType(type); 
    this.setCode(code); 
} 

@Override 
public String toString(){ 
    return this.Title + " " + this.Autor + " " + this.Type + " " + this.Code; 
} 

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

private final Music[] musicList; 
private int counter; 

public ManageMusic(int maxSize) { 
    musicList= new Music[maxSize]; 
    counter= 0; 

public void add(Music m){ 
    musicList[counter] = m; 
    counter++; 
} 

Здесь я должен создать удалить метод, который будет удалить especific объект из musicList и возврата этот список без этого объекта.

Это способ добавить музыкальные элементы к musicList на основного класса:

static ManageMusic musiclist = new ManageMusic(20); 
musicList.add(new Music(title, autor, format, code)); 

Мой подход к удаления метода в ManageMusic класс скопировать этот list в новую строку [], а затем скопируйте его обратно в список. Но, как я использую Objet от музыки вместо из строки, я не могу сделать копию обратно, потому что он не отбрасывает строку в musicList:

public void delete(int code){ 
     String[] newString = new String[musicList.length]; 
     int index_1 = 0; 
     for (int i=0; i<musicList.length; i++){ 
      if(i != code){ 
       newString[index_1] = musicList[i].toString(); 
       index_1++; 
      } 
     } 
     int index_2 = 0; 
     for (int i=0; i<newString.length; i++){ //THIS IS WHERE IT SAYS: Cannot convert 
               // from String to Music 
      musicList[index_2] = newString[i]; 
      index_2++; 
     } 
    } 

я должен сделать что-то не далеко из-за этого, потому что тогда у меня есть метод, который перечисляет элементы из musicList, поэтому я не могу установить оператор return для метода.

+3

[ArrayList] (http://docs.oracle.com/javase/7/docs/api/java/util/ArrayList.html) –

+0

Любая причина, по которой вы не используете альтернативную структуру данных, такую ​​как Связанная - или ArrayList, который имеет встроенные функции для удаления определенных объектов? – SBI

+0

@Alexey Andreev Я начинаю с java и не слишком много использую ArrayList. Можете ли вы написать ответ с примером, используя мой код? – masmic

ответ

1

Почему вы можете сделать это без ArrayList

Как предложил некоторые люди в комментариях, вы, вероятно, следует использовать ArrayLists или аналогичные материалы из пакета java.util.collection.

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

Редактировать: Во-первых: Ваша проблема в том, что вы копируете строки, а не ссылки. Вместо того, чтобы пытаться использовать метод toString, попробуйте обработать его с помощью «объектов» (то есть их ссылок).

Ошибка проверки

Как вы могли заметить, ваш add вызовет IndexOutOfBoundsException, если вы пытаетесь добавить еще одну запись после того, как ваш список достигли MAX_SIZE. Вы должны это проверить. Вы также должны проверить много вещей в следующих пояснениях, я предоставлю несколько предложений .

Простое удаление с точным, например

Просто используйте Music [] вместо String [] и скопировать ссылку ТЕмп Music [] к вашему musicList.

Лучший способ справиться с этим: динамическая структура массива

Так что я предлагаю использовать динамическую структуру массива. Вам придется много копировать массивы, что может быть немного сложно. Но в основном это то, что делает ArrayList.

Конструктор

Но как реализовать эту динамическую структуру? Давайте сначала начнем с инициализации, т. Е. Вашего конструктора. Вам не нужен параметр для максимального размера (если вы не хотите ограничить свою музыкальную коллекцию по какой-либо причине). Просто создать массив с размером 0. (конечно, вы также можете реализовать конструкторы копирования и другие вещи, но для начала держать его просто.)

надстройку()

Чтобы добавить больше музыки, вам просто создайте новый массив с размером вашей текущей коллекции + 1, скопируйте все ссылки (это, вероятно, ответ, который вы искали. Вы берете строки, но просто берете сами объекты) из текущего массива в новый массив , добавьте новый Music и измените ссылку своей переменной-члена на ваш вновь созданный больший массив (т.е. присваивая musicList = tempArray; или что-то подобное). (Проверка ошибок: это объект пустой?)

удаления()

Для удаления вы можете сделать только то же самое. Создайте новый временный массив (на этот раз с уменьшенным размером), скопируйте все значения, но не оставьте тот, который хотите удалить. Чтобы определить, какие из них должны быть удалены, вы можете либо проверить индексы, либо проверить объекты на равенство. (Проверка ошибок: размер массива temp никогда не должен быть меньше 1, поэтому проверьте, пуст ли ваш массив - рассмотрите для этого метод, например isEmpty().)

Зачем мне это делать?

Как только вы приобретете эти концепции, вы сможете управлять своим массивом любым способом. Просматривайте его, удаляйте все элементы, копируйте свою музыкальную коллекцию своим друзьям и т. Д.

И что дальше?

И после того, как вы это узнали, попробуйте ArrayList - вы поймете, что это очень похоже на то, что вы только что написали. И теперь вы можете гордиться тем, что не только можете использовать ArrayLists, но и знать, как и почему они ведут себя так, как они.

+0

Очень полезный ответ, чтобы узнать об этом. Мне нужно будет несколько раз прочитать это, чтобы понять это и попытаться реализовать его – masmic

1

Его лучше использовать ArrayList, чем писать собственную логику для удаления объекта из существующего массива.Вот как вы можете использовать ArrayList:

{ 
    ArrayList<Music> list = new ArrayList<Music>(); 
    Music m1 = new Music(title, autor, format, code); 
    list.add(m1); 
    // similarly you can check whether object is present in ArrayList or not using 
    if(list.contains(m1)){ // This check whether object is present in ArrayList or not 
      //Do whatever you want 
    } 
} 
1

ArrayList пример:

List<Music> musicList = new ArrayList<Music>(); 

добавить в конец списка списка:

musicList.add(new Music(...)); 

добавление к указанной позиции в списке (более поздние все движение до одного места)

musicList.add(index, new Music(..)); 

удалить из списка:

musicList.remove(index); 

или

musicList.remove(someMusic); 

Размер списка:

int size = musicList.size(); 

Получить первую музыку:

Music first = musicList.get(0); 

Получить последнюю музыку:

Music last = musicList.get(musicList.size()-1); 

Loop:

for (Music : musicList) { 
    //do stuff 
} 
1

сделать так

public void delete(int code){  
    List<Music> list = new ArrayList<Music>(); //creating new empty list 
    for (Music m:musicList){ 
     if(m.code != code){ // removing condition 
      list.add(m); // adding music to new list 
     } 
    } 
    musicList = list.toArray(new Music[list.size()]); // assigning back list to musicList 
} 
Смежные вопросы