Мне задавали этот вопрос некоторое время в вопросе об интервью, и я немного застрял в том, как реализовать его часть.
Вопрос об интервью был:
Найти дубликатаобъекты в данном списке. * Два человека считаются одинаковыми, если они имеют одинаковую фамилию и одно и то же имя. * Два первых имени считаются одинаковыми, если они буквально совпадают или отображаются в одной строке файла словаря. * Каждая строка словарной строки содержит строки, разделенные запятыми *, представляющие имена, которые считаются эквивалентными:
Эта проблема состоит из 2 частей (для меня): 1) Если имена и фамилии являются точното же самое, пометьте их как дубликаты - у меня есть HashSet для этого.
2) Необходимо создать реальный словарь, который будет проверять, считаются ли два имени одинаковыми (т. е. Энди и Эндрю) - я создал HashMapдля этого.
<code>import java.io.*;
import java.util.*;
import java.util.Map.Entry;
/**
* Find duplicate person objects in the given list.
* <p>
* Two persons are considered the same if they have the same last name and
* the same first name.
* Two first names are considered the same if they are literally the same
* or they appear in the same row of the dictionary file.
* Each row of the dictionary String contains comma separated strings
* representing first names that are considered equivalent:
* <pre>
* bob, robert
* liz, elizabeth
* ...
*
* Алекс Джонс * Рэнди Смит * Александр Джонс * Рэнди Смит * Энди Браун * * [[Алекс Джонс, Александр Джонс], [Рэнди Смит, Рэнди Смит]] * / class SolutionRetry {//Тестовые данные private static final Random random = new Random (1234);// Список имен личных статических List firstNames = Arrays.asList ("bob", "robert", "andy", "andrew", "alex", "alexander", "nathan", "nathaniel");// Список фамилий закрытая статическая List lastNames = Arrays.asList ("jones", "smith", "jones", "brown");// Произвольная выборка имени первого частного статического String getRandomFirstName () {return firstNames.get (random.nextInt (firstNames.size ()));} // Создает список объектов person. Private static List getPersonsList () {List Person = new ArrayList ();for (String lastName: lastNames) {for (int i = 0; i <5; i ++) {people.add (new Person (getRandomFirstName (), lastName));}} возвращение лиц;} открытый статический класс Person {private String firstName;private String lastName;public Person (String firstName, String lastName) {this.firstName = firstName;this.lastName = lastName;} public String getFirstName () {return this.firstName;} public String getLastName () {return this.lastName;}} // «СЛОВАРЬ», заданный как строковая личная статическая конечная строка. public static void main (String [] args) {List <Person>people = getPersonsList ();Списокduplicates = findDuplicates (лиц);for (Список duplicatePeople: duplicates) {// System.out.println ("Кластер" + duplicatePeople.get (0) .getLastName ());for (Person person: duplicatePeople) {// System.out.println (person.getFirstName () + "" + person.getLastName ());}}} / * alex brown alex brown alex brown [[alex brown ale, ... 4 раза]] * / / * @param Persons список лиц * @ вернуть список повторяющихся кластеров, каждый элемент - это список* дубликаты лиц. Вернуть пустое *, если дубликаты не найдены. * / public static ListfindDuplicates (Список лиц) {// Это то, что я пытаюсь до сих пор Списокtotallist = новый ArrayList();// Создать пустой HashSet HashSet names = new HashSet ();HashMapсинонимы = новый HashMap();for (Person p: person) {// Если имя уже существует в HashSet, выведите дубликат имени if (! names.add (p.firstName + "" + p.lastName)) {System.out.println ("Найдено повторяющееся имя !:" + p.firstName + "" + p.lastName);}}// Разделить строку словаря, сначала символом новой строки String [] split = DICTIONARY.split ("\ n");Строка [] дальнейший раздел = ноль;for (int i = 0; i itr = names.iterator ();// Я думал об обходе хэш-набора и использовании хэш-карты для поиска любых похожих имен. while (itr.hasNext ()) {} System.out.println («Что такое hashset:» + names);вернуть тоталлист;}}
Прямо сейчас я застрял в том, как использовать словарь, чтобы проверить, совпадают ли два имени. Я просто ищу идеи о том, как решить проблему, и я был бы признателен за любую помощь!