Удалите дубликаты из списка и переместите другой дубликат в начало списка

#java

#java

Вопрос:

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

 public class MemberList {

    List<String> members;

    public MemberList() {
        this.members = new ArrayList<String>();
    }

    //This is the part I'm trying to fix!!!
    public void addMember(String FirstName, String LastName) {
        members.add(0, FirstName   " "   LastName);
    }
}
  

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

1. Вы можете заставить вас использовать методы ArrayList contains() и remove() и add(), чтобы сделать это. В целях эффективности было бы лучше использовать Set .

2. Как бы вы это сделали?

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

4. Также рекомендую вам быть немного более конкретным в отношении того, что происходит не так, что вы сделали, чтобы попытаться устранить проблему, какие сообщения об ошибках вы получаете и т. Д

Ответ №1:

Вместо ArrayList, я думаю, вам следует использовать LinkedHashSet, поскольку в вашей коллекции не допускается дублирование элементов. И LinkedHashSet зарезервирует порядок вставки, поэтому при обнаружении дубликата вы можете удалить старый и вставить новый для установки.

 public class MemberList {

    Set<String> members;

    public MemberList() {
        this.members = new LinkedHashSet<String>();
    }

    public void addMember(String FirstName, String LastName) {
        String key = FirstName   " "   LastName;
        if (members.contains(key)) {
            members.remove(key);
        }
        members.add(key); // Always add to tail
    }
}
  

Помните, что LinkedHashSet всегда будет добавлять новые элементы в хвост, поэтому вам нужно получить последний элемент для вашего начального случая.

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

1. new LinkedHashSet<>(); — здесь нет необходимости упоминать тип данных. И вы не собираетесь ничего упоминать о соглашении об именовании Java?

2. Я просто копирую его код и делаю некоторые обновления. Разозлите его, если хотите.

Ответ №2:

Перечислите способ выполнения задачи (не предпочтительный из-за эффективности):

 public void addMember(String FirstName, String LastName) {
    String name = FirstName " " LastName;

    if(members.contains(name)) {  // checks if the list contains name value 
        members.remove(name);     // removes the first occurrence of the name from the list
        members.add(0,name);  // adds the name to 0th position of the list
    } else {
        members.add(name);   // if name not found in list, appends the value to the list
    }   
}
  

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

1. Это крайне неэффективно. Набор — гораздо лучший вариант.

2. Я прокомментировал то же самое. Но пользователь явно запросил способ списка.