Skip to content

Commit 4d8ace3

Browse files
committed
Stable mariage API
1 parent e586aec commit 4d8ace3

File tree

2 files changed

+137
-0
lines changed

2 files changed

+137
-0
lines changed

StableMarriage/Person.java

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
package StableMarriage;
2+
3+
import java.util.*;
4+
5+
public class Person {
6+
7+
private String name;
8+
private Person partner;
9+
private List<Person> candidates;
10+
private int candidateIndex;
11+
12+
public List<Person> getCandidates() {
13+
return candidates;
14+
}
15+
16+
public int getCandidateIndex() {
17+
return candidateIndex;
18+
}
19+
20+
Person(String name) {
21+
this.name = name;
22+
this.partner = null;
23+
this.candidates = new ArrayList<>();
24+
this.candidateIndex = 0;
25+
}
26+
27+
public void setCandidates(Person... candidates) {
28+
this.candidates.addAll(Arrays.asList(candidates));
29+
}
30+
31+
public void setCandidateIndex(int candidateIndex) {
32+
this.candidateIndex = candidateIndex;
33+
}
34+
35+
public String getName(){
36+
return this.name;
37+
}
38+
public void setName(String name) {
39+
this.name = name;
40+
}
41+
42+
public Person getPartner(){
43+
return this.partner;
44+
}
45+
public void setPartner(Person partner) {
46+
this.partner = partner;
47+
}
48+
49+
/* get the prefered person from the available list */
50+
public Person getNext(){
51+
return (this.candidateIndex >= this.candidates.size()) ? null : this.candidates.get(this.candidateIndex++) ;
52+
}
53+
54+
/* get the rank of a person */
55+
public int rank(Person p){
56+
for (int i = 0; i < this.candidates.size(); i++) {
57+
if(p == this.candidates.get(i)) return i;
58+
}
59+
return -1;
60+
}
61+
62+
/* compare the partner and the person */
63+
public boolean prefers(Person p){
64+
return (this.rank(p) < this.rank(this.partner));
65+
}
66+
67+
public void engageTo(Person p){
68+
if(p.partner != null) p.partner.partner = null;
69+
p.partner = this;
70+
if(this.partner != null) this.partner.partner = null;
71+
this.partner = p;
72+
}
73+
}

StableMarriage/StableMarriage.java

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
package StableMarriage;
2+
import java.util.*;
3+
public class StableMarriage {
4+
5+
public static void main(String[] args) {
6+
7+
Person man1 = new Person("man1");
8+
Person man2 = new Person("man2");
9+
Person man3 = new Person("man3");
10+
11+
Person woman1 = new Person("woman1");
12+
Person woman2 = new Person("woman2");
13+
Person woman3 = new Person("woman3");
14+
15+
man1.setCandidates(woman2, woman3, woman1);
16+
man2.setCandidates(woman3, woman2, woman1);
17+
man3.setCandidates(woman2, woman1, woman3);
18+
19+
woman1.setCandidates(man2, man1, man3);
20+
woman2.setCandidates(man3, man1, man2);
21+
woman3.setCandidates(man2, man1, man3);
22+
23+
List<Person> women = new ArrayList<>();
24+
women.addAll(Arrays.asList(woman1, woman2, woman3));
25+
26+
engageEveryone(women);
27+
displayMarriage(women);
28+
}
29+
30+
/* check if this mariage is stable */
31+
public static boolean isStable(List<Person> women, List<Person> men) {
32+
for (Person women1 : women) {
33+
for (Person men1 : men) {
34+
if (women1.prefers(men1) && men1.prefers(women1)) {
35+
return false;
36+
}
37+
}
38+
}
39+
return true;
40+
}
41+
42+
/* engage all women acording to their preferences */
43+
public static void engageEveryone(List<Person> women) {
44+
boolean done;
45+
do {
46+
done = true;
47+
for (Person w : women) {
48+
if (w.getPartner() == null) {
49+
done = false;
50+
Person man = w.getNext();
51+
if (man.getPartner() == null || man.prefers(w))
52+
w.engageTo(man);
53+
}
54+
}
55+
} while (!done);
56+
}
57+
58+
/* print the couples name */
59+
private static void displayMarriage(List<Person> women) {
60+
for (Person woman : women) {
61+
System.out.println("( " + woman.getName() + ", " + woman.getPartner().getName() + " )");
62+
}
63+
}
64+
}

0 commit comments

Comments
 (0)