В описании проблемы у меня есть число «n» с числом членов «n».Сопряжение среди членов в том же списке в java
например:
John jane (family 1)
tiya (family 2)
Erika (family 3)
Я должен назначить всех членов таким образом, что человек не должен спариваться с членом его семьи. и вывод должен быть:
John => tiya
jane => Erika
tiya => jane
Erika => john
Я создал объект Person(name ,familyID, isAllocated)
. Создал список и добавил personName_id
в этом.
Я собираюсь использовать карту для объединения. Так что john_1
будет ключевым, а tiya_2
будет стоить.
Я не могу связать эти пары через карту. Как я могу перетасовать элементы списка.
Также было бы неплохо, если бы кто-нибудь мог предложить мне лучшее решение.
Код:
Получение лицо:
public static List getperson()
{
Scanner keyboard = new Scanner(System.in);
String line = null;
int count = 0;
List <Person> people = new ArrayList<>();
while(!(line = keyboard.nextLine()).isEmpty()) {
String[] values = line.split("\\s+");
//System.out.print("entered: " + Arrays.toString(values) + "\n");
int familyid = count++;
for(String name :values)
{
Person person = new Person();
person.setFamilyId(familyid);
person.setName(name);
person.setAllocated(false);
people.add(person);
}
}
return people;
}
Mapping:
public static List mapGifts(List pesonList)
{
Map<String , String> personMap = new HashMap<String , String>();
Iterator<Person> itr = pesonList.iterator();
Iterator<Person> itr2 = pesonList.iterator();
List<String> sender = new ArrayList<>();
while(itr.hasNext())
{
Person p = itr.next();
sender.add(p.getName()+"_"+p.getFamilyId());
personMap.put(p.getName()+"_"+p.getFamilyId(), "");
// p.setAllocated(true);
}
while(itr2.hasNext())
{
/*if(p.isAllocated())
{*/
// Separate Sender name and id from sender list
//check this id match with new p1.getFamilyId()
for(String sendername :sender)
{
// System.out.println("Sender "+sendername);
personMap.put(sendername, "");
String[] names = sendername.split("_");
String part1 = names[0]; // 004
String familyId = names[1]; // 004
Person p2 = itr2.next();
System.out.println(p2.getFamilyId() +" "+familyId +" "+p2.isAllocated());
if(p2.isAllocated())
{
for (String value: personMap.values()) {
if (value != sendername) {
}
}
}
if(p2.getFamilyId() != Integer.parseInt(familyId))
{
// add values in map
}
}
break;
// Person newPerson = personLists.get(j);
}
for (Iterator it = personMap.entrySet().iterator(); it.hasNext();)
{
Map.Entry entry = (Map.Entry) it.next();
Object key = entry.getKey();
Object value = entry.getValue();
System.out.println("Gifts "+key+"=>"+value);
}
return pesonList;
}
Благодаря
Пожалуйста, подтвердите свой код. – user1803551
Один из возможных ответов - вы должны дать весь возможный ответ на объединение семьи в каждой семье. Уменьшите те, которые совпадают. Если вам нравится больше узнать, попробуйте сопоставить их как набор предметов, например A -> B, C, D; B-> C, D, C-> D (что означает пары A с парами B, C, D; B с C, D и C-> D) –
Спасибо @TingShunNg. Но мне нужно отобразить только одного члена в списке, и он/она не должны находиться в одной семье. кроме того, я должен сопоставлять каждого члена таким образом, чтобы он/она должен был быть отправителем, а также получателем. – Pranoti