Как проверить, содержат ли два объекта одинаковые слова независимо от порядка? - PullRequest
0 голосов
/ 05 декабря 2018

Итак, у меня есть два объекта, names1 и names2, и это просто массив имен, которые пользователь выбирает для ввода.Я хочу создать код, который проверяет, содержат ли два объекта одинаковые слова, независимо от порядка.Нравится

Enter names ( n to stop):
John
Charles
n

Enter names (n to stop):
Charles
John

true

Ответы [ 2 ]

0 голосов
/ 05 декабря 2018

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

Когда вы хотите сохранить кучу элементов, и порядок элементов не имеет значения, вам следует подумать «установить» вместо «список»,Наборы - это наборы, подобные спискам, но наборы не сохраняют порядок.

Set<String> names;

Замечательно то, что вам вообще не нужен класс Name.Set<String> делает именно то, что вы пытаетесь сделать с вашим пользовательским классом Name, без необходимости писать код вообще.Вы можете добавлять имена в набор и сравнивать наборы с equals(), все из коробки.

public static boolean sameCoins(Set<String> n1, Set<String> n2) {
    return n1.equals(n2);
}

Наиболее распространенная конкретная реализация Set - HashSet:

Set<String> names = new HashSet<>();

Хэш-набор быстр и эффективен, но у него есть один существенный недостаток: он не хранит элементы по порядку.Если вы распечатаете элементы в хэш-наборе, они будут выглядеть случайными.Они не в том порядке, в котором вы их вставили, как список, и не в алфавитном порядке.Если это имеет значение, вы можете переключиться на LinkedHashSet (сохраняет порядок вставки) или TreeSet (сортирует элементы).

0 голосов
/ 05 декабря 2018

Используйте List.containsAll(Collection) как,

public boolean sameCoins(Name n) {
    return name.size() == n.name.size() && name.containsAll(n.name);
}

Кроме того, ваш конструктор в настоящее время имеет необработанный тип (не используйте необработанные типы).И запрограммируйте интерфейс List.

private List<String> name;

public Name() {
    name = new ArrayList<>();
}
...