ãã®èšäºã§ã¯ã人ã®ååãå€å¥ããæ¹æ³ã人ã®åäŸã®ããŒãžãžã®ãªã³ã¯ãèšç®ããæ¹æ³ãããã³å®¶ç³»å³ãçæããããã®ã¢ã«ãŽãªãºã ãæ§ç¯ããæ¹æ³ã説æããŸãã
Java ã Selenium Webdriver ã Chromeã䜿çšããŸã ã Chromeã¯ãä»ã®ãã©ãŠã¶ãŒãããé«éã§ãããURLãããã²ãŒãããããšãããã°ã©ã ã§æãæéã®ãããæäœã§ããããããã©ãŠã¶ãŒã®éžæãæéã«æã倧ãã圱é¿ããããã§ãã PhantomJsã䜿çšãããšããã©ãŠã¶ãŒãå®å šã«æŸæ£ããŠäœ¿çšã§ããŸããããããã°ãé£ãããªããŸãã ã ããç§ã¯Chromeã«èœã¡çããŸããã
ãŸãããã©ãŠã¶ãæ£åžžã«èµ·åããããšãããã³URL https://ru.wikipedia.org/wiki/Rurikã«ã¢ã¯ã»ã¹ãããšããRurik-WikipediaããšããèŠåºãã®ããŒãžãéãããšã確èªãããã¹ããäœæããŸãã
@BeforeClass public static void Start() { driver = DriverHelper.getDriver(); } @Test public void testGetDriver() { driver.navigate().to("https://ru.wikipedia.org/wiki/%D0%A0%D1%8E%D1%80%D0%B8%D0%BA"); assertTrue(driver.getTitle().equals(" â ")); } @AfterClass public static void Stop() { driver.quit(); }
ãããžã§ã¯ããã³ã³ãã€ã«ããããã¹ããæåããããã«ãéçgetDriverïŒïŒã¡ãœããã䜿çšããŠDriverHelperã¯ã©ã¹ãäœæããŸãã
public final class DriverHelper{ private static final int TIMEOUT = 30; public static WebDriver getDriver() { WebDriver driver = new ChromeDriver(); driver.manage().window().maximize(); driver.manage().timeouts().implicitlyWait(TIMEOUT, TimeUnit.SECONDS); return driver; } }
ãã¹ããå®è¡ããŠããã©ãŠã¶ãŒãæ£ããèµ·åããç®çã®ããŒãžãéãããšã確èªããŸãã
Personã¯ã©ã¹ã®äœæ
次ã«ãå人ã«é¢ããæ å ±ãä¿åããPersonã¯ã©ã¹ã®äœæãšãWikipedia PersonPageã®å人ããŒãžã¯ã©ã¹ã®äœæã«é²ã¿ãŸãããã
ãããŸã§ã®Personã¯ã©ã¹ã«ã¯ãnameãšurlã®2ã€ã®ãã£ãŒã«ããããããŸããã ååãšããŠãå§ãååãããããããã¯ãtkã«åé¢ããã«ã人ã®ãã«ããŒã ã䜿çšããŸã çæã®ã»ãšãã©ã®ä»£è¡šè ã«ã¯å§ã¯ãããŸããããããã¯ããŒã ãã¿ã€ãã«ãããã³åºåããããŸãã
Urlã¯ããã®äººå°çšã®WikipediaããŒãžãæããŸãã
人ã®åœ¢æããã§ãã¯ãããã¹ããäœæããŸãã
@Test public void testGetPerson() throws Exception { PersonPage page = new PersonPage(driver); Person person = page.getPerson("https://ru.wikipedia.org/wiki/_"); assertTrue(person.getName().equals(" ")); assertTrue(person.getUrl().equals( "https://ru.wikipedia.org/wiki/ %D0%92%D0%BB%D0%B0%D0%B4%D0%B8%D0%BC%D0%B8%D1%80_ %D0%90%D0%BB%D0%B5%D0%BA%D1%81%D0%B0%D0%BD%D0%B4%D1%80%D0%BE%D0%B2%D0%B8%D1%87")); }
testGetPersonïŒïŒã¯ã³ã³ãã€ã«ãããŸããã PersonPageããŒãžãäœæããŠã人ã®ååãšããŒãžã決å®ããå¿ èŠããããŸãã URLã¯çŸåšã®ããŒãžã®URLã«ãã£ãŠæ±ºå®ãããååã¯firstHeadingèå¥åãæã€ã¿ã°ã®ããã¹ãã³ã³ãã³ãã«ãã£ãŠæ±ºå®ãããŸãã GetPersonïŒïŒã¡ãœããïŒ
public Person getPerson(String url) throws MalformedURLException { driver.navigate().to(url); String name = getName(); Person person = new Person(driver.getCurrentUrl()); person.setName(name); return person; } private String getName() throws MalformedURLException { String namePage = driver.findElement(By.cssSelector("#firstHeading")).getText(); return namePage; }
ãã¹ããåå®è¡ããŸã-ç·ã«å€ãããŸããã
ãããšã¯å¥ã«ããã©ã¡ãŒã¿ãŒãšããŠæž¡ãããŸãããURLãåå®çŸ©ãããçç±ã«èšåãã䟡å€ããããŸããäºå®ãWikipediaã§ã¯ã1人ã1ã€ã®ããŒãžã«ãªãã€ã¬ã¯ããããè€æ°ã®ããŒãžã«å°å¿µã§ããŸãã ãã®çµæãå ã®URLã䜿çšããå Žåããç°ãªããURLãæã€è€æ°ã®äººïŒå®éã«ã¯1人ïŒããããšãã«éè€ãçºçããå¯èœæ§ããããŸãã ãããã£ãŠãURLã¯URLãšããŠäœ¿çšãããä»ã®ãã¹ãŠã®URLã«ãªãã€ã¬ã¯ããããŸãã
ããšãã°ãããŒãžhttps://ru.wikipedia.org/wiki/Yaroslav_Mudryã¯https://ru.wikipedia.org/wiki/Yaroslav_Vladimirovich_Wiseã«ãªãã€ã¬ã¯ãããããŒãžhttps://ru.wikipedia.org/wiki/Andrey_Bogolyubsky-httpsã«ãªãã€ã¬ã¯ãããŸãïŒ//ru.wikipedia.org/wiki/Andrey_Yuryevich_Bogolyubsky
人ã®åäŸã®å®çŸ©
ãŠã£ãããã£ã¢ã«èªåã®ããŒãžãæã£ãŠãã人ã®åäŸãç¹å®ããŠã¿ãŸãããã
ãŸããRurikã®åïŒããæ£ç¢ºã«ã¯1- Igor ïŒãå€å¥ãããã¹ããäœæããŸãã
@Test public void testGetChildrenUrl() throws Exception { driver.navigate().to("https://ru.wikipedia.org/wiki/"); PersonPage page = new PersonPage(driver); List<Person> children = page.getChildrenUrl(); assertTrue(children.size() == 1); Person person = children.get(0); assertTrue(person.getUrl().equals("https://ru.wikipedia.org/wiki/ %D0%98%D0%B3%D0%BE%D1%80%D1%8C_ %D0%A0%D1%8E%D1%80%D0%B8%D0%BA%D0%BE%D0%B2%D0%B8%D1%87")); }
ãã¹ããæåãããã«ã¯ãPersonPageããŒãžã«äººéã®åäŸã®URLã決å®ããã¡ãœãããè¿œå ããå¿ èŠããããŸãã
public List<Person> getChildrenUrl() throws MalformedURLException { List<WebElement> childrenLinks = driver.findElements( By.xpath("//table[contains(@class, 'infobox')]//tr[th[.=':']]//a")); List<Person> children = new ArrayList<Person>(); for (WebElement link : childrenLinks) { Person person = new Person(link.getAttribute("href")); children.add(person); } return children; }
çŸæç¹ã§ã¯ããŠã£ãããã£ã¢ã®ããŒãžã®åäŸãã¡ã¯ç®èº«çã§ã¯ãªãå¯èœæ§ããããããããŒãžãžã®ãªã³ã¯ããªããšããäºå®ãç¡èŠããŸãã ããšãã°ã ãŠã©ãžããŒã«ã€ãã¹ã©ãããïŒã¬ãªãããŒçåïŒã®åäŸãã¡ã®å Žåãšåæ§ã§ãã ãŸããããšãã°ããªã¢ ããããã®ã®ããŒãžãã¹ãŽã£ã¢ãã¹ã©ããŽã»ãŽã©ãããŽã£ããïŒããªã³ã»ã¹ãã©ããã§ãã¹ããŒïŒã®ããŒãžãªã©ãåå«ã«é¢ããæ å ±ãã¡ã€ã³ãšãªã¢ã«ãããšããäºå®ãç¡èŠããŸã ã
人ã®åäŸã®æ£ããå®çŸ©ãæ€èšŒãããã¹ããè¿œå ããŸãã
äžã§è¿°ã¹ãããã«ãåœé¢ã¯ããŠã©ãžããŒã«ã»ã€ãã¹ã©ãŽã£ãïŒã¬ãªã·ã¢ã®çåïŒãšããªã¢ã»ããããã¬ã«ã¯åäŸããªãã ãŠã©ãžããŒã«ã»ã¹ãã¢ãã¹ã©ãŽã£ããã«ã¯16人ã®åäŸããããšä»®å®ããŸããããŠã£ãããã£ã¢ã¯åœŒã«ã¯ååã§æªç¥ã®åšã5人ãããšäž»åŒµããŠããŸãã
@Test public void testChildrenSize() throws Exception { driver.navigate().to("https://ru.wikipedia.org/wiki/"); PersonPage page = new PersonPage(driver); List<String> children = page.getChildrenUrl(); assertTrue(children.size() == 1); driver.navigate().to("https://ru.wikipedia.org/wiki/_"); children = page.getChildrenUrl(); assertTrue(children.size() == 16); driver.navigate().to("https://ru.wikipedia.org/wiki/__(_)"); children = page.getChildrenUrl(); assertTrue(children.size() == 0); driver.navigate().to("https://ru.wikipedia.org/wiki/_"); children = page.getChildrenUrl(); assertTrue(children.size() == 0); }
Personã¯ã©ã¹ã§ãå人ã®äžæã®èå¥åïŒint idïŒãšãåäŸã®èå¥åãæ ŒçŽãããå人ã®åã®ãªã¹ãïŒList <Integer> childrenïŒã®ãã£ãŒã«ããè¿œå ããŸãã
åã®èå¥åã人ã®åã®ãªã¹ãã«è¿œå ããæ¹æ³ãéçºããŸãã åã¯ããªã¹ãã«è¿œå ãããŠããªãå Žåã«ã®ã¿ãªã¹ãã«è¿œå ã§ããŸãã
public void setChild(int childId) { if (!children.contains(childId)) { children.add(childId); } }
ãã¡ãããã³ãŒãå šäœããã¹ãã§èŠããã°ãªãŒã³ãªçµæãéæããããšãå¿ããªãã§ãã ããã
åå«æ€çŽ¢ã¢ã«ãŽãªãºã
ããã§ã¯ãæãèå³æ·±ãéšåãã€ãŸãç¹å®ã®äººç©ã®åå«ãèŠã€ããããã®ã¢ã«ãŽãªãºã ã®éçºã«ç§»ããŸãããã mainã¡ãœããã§GenerateGenealogicalTreeã¯ã©ã¹ãäœæããŸãã
æ¢ã«è¿°ã¹ãããã«ãæãæéããããã®ã¯URLã®ç§»è¡ã§ããããããããã®ç§»è¡ã®æ°ãæå°éã«æããå¿ èŠããããŸãã ãããè¡ãã«ã¯ã家系å³å šäœãä¿åãããå人ã®ãªã¹ããäœæããŸãã ãã®ãªã¹ãã§ãçŸåšã®äººã®ã€ã³ããã¯ã¹ãèŠããŠãããŠãã ãã-çŸåšããŒãžã«ãã人ã ã€ã³ããã¯ã¹ãäœã人ã¯ãã¹ãŠã蚪åæžã¿ããšã¿ãªãããã€ã³ããã¯ã¹ãé«ã人ïŒ+çŸåšïŒã¯ãã¹ãŠã蚪åãããŠããªãããšã¿ãªãããŸãã çŸåšã®äººã®ããŒãžã«ç§»è¡ãã圌女ã®åºæ¬ããŒã¿ãèšç®ãããåŸãã€ã³ããã¯ã¹ã1ã€å¢å ããŸãã ãããã£ãŠãçŸåšã®äººã¯ã蚪åæžã¿ãã®ã«ããŽãªã«åé¡ãããŸãã ãããŠãæ®ãã®ã蚪åãããŠããªãã人ããã€ãã¹ããã ãã§ãã ãã€ã§ããããŒãžããã§ã«é²èŠ§ãããŠãã人ã¯ç¥ãããŠããŸãã
åå«ã®ãªã¹ãã®æåŸã«çŸåšã®äººãè¿œå ããããšã«ããã家系å³ã«æ°ããã蚪åãããŠããªãã人ããã£ã±ãã«ãªããŸãã ãã®å Žåããªã¹ãã«ãŸã ãªãåäŸã ããè¿œå ããŠéè€ããªãããã«ããŸãïŒãã®ãããªç¶æ³ã¯ã倫ãšåŠ»ãäž¡æ¹ãšãç°ãªãæ¯éšã®çæã®ç¥å ã®åå«ã§ããå Žåã«å¯èœã§ããäŸïŒ 倫ãšåŠ»ã¯ã«ãŒãªãã¯ã®åå«ã§ããã 倫ãšåŠ»ã¯åå«ã§ãããŒã«I ïŒã
家系å³ã¯ãã蚪åãããŠããªãã人ãããªããšãã«æ§ç¯ããããšèããããŸãã çŸåšã®äººç©ã®ã€ã³ããã¯ã¹ã家系å³ã®ãµã€ãºãšçãããªã£ããšãã
ã¢ã«ãŽãªãºã ã¯æ¬¡ã®ãšããã§ãã
- æå®ãããURLã«åºââã¥ããŠçæã®åµèšè ãäœæããŸã
- 家系å³ã¯ãçæã®åµèšè ã«åºã¥ããŠäœæãããŸã
- ã蚪åãããŠããªãã人ãããéãããµã€ã¯ã«å
- å人ã¯ã家系å³ã®çŸåšã®URLã«åºââã¥ããŠèšç®ãããŸãã ãã®äººç©ã¯çŸåšã®äººç©ãšããŠèšå®ãããŠããŸãã
- çŸåšã®äººç©ãéè€ããŠããªãå Žåã圌女ã®åäŸã®ãªã¹ããèšç®ããã確ç«ãããŸãã ãã¹ãŠã®åããªã¹ãã«è¿œå ãããŸãã
- çŸåšã®äººããã§ã«ã蚪åããã人ã®éã§äŒã£ãŠããå Žåã圌女ã¯åé€ãããŸãã
- 次ã®ã蚪åãããŠããªãã人ãžã®ç§»è¡ããããããããçŸåšããšèŠãªãããŸãã
ã¢ã«ãŽãªãºã ã³ãŒãïŒ
public final class GenerateGenealogicalTree { public static void main(String[] args) throws Exception { String url = getUrl(args); GenealogicalTree tree = getGenealogicalTreeByUrl(url); saveResultAndQuit(tree); } public static GenealogicalTree getGenealogicalTreeByUrl(String url) throws MalformedURLException { WebDriver driver = DriverHelper.getDriver(); Person person = new Person(url); GenealogicalTree tree = new GenealogicalTree(person); PersonPage page = new PersonPage(driver); while (tree.hasUnvisitingPerson()) { String currentUrl = tree.getCurrentUrl(); Person currentPerson = page.getPerson(currentUrl); tree.setCurrentPerson(currentPerson); if (!tree.isCurrentPersonDeleted()) { List<Person> children = page.getChildrenUrl(); tree.setChildren(children); } tree.updatingCurrentPerson(); } driver.quit(); return tree; } }
GenealogicalTreeã¯ã©ã¹ã«ã¯ã3ã€ã®ãã£ãŒã«ãããããŸããList <Person> allPersons-家系å³ã®ãã¹ãŠã®ä»£è¡šã®ãªã¹ããint indexCurrentUnvisitedPerson-allPersonsãªã¹ãå ã®çŸåšã®äººç©ã®ã€ã³ããã¯ã¹ãããã³ããŒã«isCurrentPersonDeleted-ãçŸåšã®ã人ç©ãåé€ããããã©ããã®ãµã€ã³è€è£œïŒã
public final class GenealogicalTree { private List<Person> allPersons; private int indexCurrentUnvisitedPerson; private boolean isCurrentPersonDeleted; }
åæåã¯çæã®ãç¥å ãã«åºã¥ããŠè¡ãããŸã-ç§ãã¡ãæ¢ããŠããåå«ãæã€æåã®äººïŒ
public GenealogicalTree(Person person) { if (person == null) { throw new IllegalArgumentException(" "); } allPersons = new ArrayList<Person>(); allPersons.add(person); indexCurrentUnvisitedPerson = 0; isCurrentPersonDeleted = false; }
ãã®æç¹ã§ã家系å³ã¯çŸåšã®ãæªèšªåãã®äžäººã§æ§æãããŠããŸãã ã蚪åãããã人ã¯ããªãã
ãã§ã«è¿°ã¹ãããã«ãã蚪åãããŠããªãã人ã®ååšã®ãªã¹ãã®ãã§ãã¯ã¯æ¬¡ã®ããã«å®è¡ãããŸããçŸåšã®äººã®ã€ã³ããã¯ã¹ããçµããã«éãããå Žåãã蚪åãããŠããªãã人ã¯ããªããšèããããŸãã
public boolean hasUnvisitingPerson() { return indexCurrentUnvisitedPerson < allPersons.size(); }
è¡çµ±ããªãŒã®URLã¯ãçŸåšã®äººã®URLã§ãã
public String getCurrentUrl() { return allPersons.get(indexCurrentUnvisitedPerson).getUrl(); }
setCurrentPersonã¡ãœããã¯ãçŸåšã®äººãç¹å®ã®äººã«çœ®ãæããŸãã
æåã¯ã芪ã®ããŒãžããååŸããURLã®ã¿ãç¥ã£ãŠããŸãã ãããã£ãŠããã®æ å ±ã ããæã€äººã家系å³ã«è¿œå ãããŸãã å®éããã¹ãŠã®ãæªèšªåãã®äººã¯åãªãURLã§ãã setCurrentPersonã¡ãœããã¯ãã€ã³ããã¯ã¹ãã圌女ã«å°éããããã®äººç©ãææ°ã«ãªã£ãåŸããã®äººç©ããæ確ã«ããŸããã
ã€ã³ã¹ããŒã«æžã¿ã®ãæŽç·Žãããã人ãæ¢ã«äŒã£ãããšãããå ŽåïŒããã¯ãçŸåšã®äººã®URLãã以åã«ééããããŒãžã®1ã€ã«ãªãã€ã¬ã¯ããçºçããå Žåã«å¯èœã§ãïŒãçŸåšã®äººã¯åé€ãããŸãã ãã®åŸãçŸåšã®äººç©ã¯åé€æžã¿ãšããŠããŒã¯ãããŸãã æå®ããã人ç©ã以åã«çºçããŠããªãå Žåã圌女ã¯çŸåšã®äººç©ãã眮ãæãããŸãã ãã®å Žåãå人ã¯åé€ããããšã¯èŠãªãããŸããã
ã以åã«äŒãããšããæŠå¿µã¯ãã蚪åããã人ã ãããã§ãã¯ããããšãæå³ããŸãã ãæªèšªåãã¯ãã§ãã¯ãããŸããã çè«çã«ã¯ãçŸåšã®äººã®URLãURLã«ãªãã€ã¬ã¯ãããããšããæªèšªåãã®ãåŸã§ãçºçããå¯èœæ§ããããŸãã ããããããã¯éåžžã«ãŸããªç¶æ³ã§ãããã¢ã¬ã€å šäœãæ¯åãå®è¡ããã䟡å€ã¯ãããŸããã ãã®ãŸããªã±ãŒã¹ã§ã¯ããã¥ãŒããå°éããããšãã«éè€ãåé€ãããçŸåšã®äººã®ã€ã³ããã¯ã¹ã¯ãªãã€ã¬ã¯ããçºçããURLãæã€äººã瀺ããŸãã
public void setCurrentPerson(Person currentPerson) { int indexDuplicate = allPersons.indexOf(currentPerson); if ((0 <= indexDuplicate) && (indexDuplicate < indexCurrentUnvisitedPerson)) { removePerson(indexDuplicate); } else { allPersons.get(indexCurrentUnvisitedPerson).copyMainData(currentPerson); isCurrentPersonDeleted = false; } }
indexOfïŒãªããžã§ã¯ããªããžã§ã¯ãïŒã¡ãœãããæ£ããæ©èœããããã«ã¯ãPersonã¯ã©ã¹ã®equalsïŒãªããžã§ã¯ããªããžã§ã¯ãïŒããã³hashCodeïŒïŒã¡ãœããããªãŒããŒã©ã€ãããå¿ èŠããããŸãã
@Override public boolean equals(Object object) { if ((object == null) || (!(object instanceof Person))) { return false; } Person person = (Person) object; return this.url.equals(person.url); } @Override public int hashCode() { return this.url.hashCode(); }
ãªã¹ãã«äººã®ååšãåžžã«ç¢ºèªããå¿ èŠãããã®ã¯ãªãã§ããïŒ
éè€ã®çºçã¯ãå€ãã®çç±ã§å¯èœã§ãïŒ
- ç¶æ§ã¯ç¢ºå®ã«äžæã§ãã ããšãã°ã Svyatopolk the Accursedã®å Žåãç¶èŠªã¯Yaropolk SvyatoslavichãŸãã¯Vladimir Svyatoslavichã®ããããã§ãã
- äž¡æ¹ã®èŠªã¯ãç°ãªããã©ã³ãã®Rurikã®åå«ã§ãã äŸïŒ ã«ãªãã¯ã®8äžä»£ç®ã®åå«ã§ããã°ã¬ããŽã»ã¹ã©ãããã¯ã åããã«ãªãã¯ã®åå«ã§ããã¢ãã¹ã¿ã·ã¢ ã€ããã«ã³ãŽããšçµå©ããŸããïŒ4人ç®ã®ããšãã§ããå§åŠ¹ã§ãïŒã
- ããŒãžã®èª€ãïŒ Vsevolod Mstislavichãæ¯åã®Volodar Glebovichãæã£ãŠããã®ã¯çãããã圌ã®äž¡èŠªã¯ä»ã®äººãèšé²ããŠãããRurikovichçæã«å±ããŠããã ã»ãšãã©ã®å ŽåãWikipediaã®åãªã誀æ€ã§ã
ãããã®éè€ãæé€ãããªãå Žåãæ°ããç¹°ãè¿ããçæãããŸãã éè€ã®ãã¹ãŠã®åå«ã¯ã2åãŸãã¯3åããåé¿ãããŸãïŒ Volodar Glebovichã®å ŽåïŒã
次ã«ãéè€ããŠãã人ããªã¹ãããåé€ããããšãæ€èšããŠãã ããã åé€ããã人ã¯ã家系å³ã®ã¡ã³ããŒã®åã®ãªã¹ãã«å«ãŸããŠããå ŽåããããŸãã ããšãã°ãäž¡æ¹ã®èŠªãåãçæã®ä»£è¡šè ã§ããå Žåãäžæ¹ã®èŠªã¯ãåãã®1ã€ã®ããŒãžãžã®ãªã³ã¯ãæã¡ãããäžæ¹ã¯æåã®ããŒãžã«ãªãã€ã¬ã¯ããããŸãã éè€ããåã«ãåé€ãããå Žåã2çªç®ã®èŠªã¯ååšããªã人ç©ãžã®ãªã³ã¯ãæã€ããšã«ãªããŸãã
ãããã£ãŠãçŸåšã®äººç©ãåé€ããåã«ããã¹ãŠã®ã蚪åæžã¿ã人ã®åäŸã®èå¥åã®ãªã¹ãã§èŠã€ãã£ãäžèŽã®èå¥åã眮ãæããå¿ èŠããããŸãïŒãæªèšªåãã®åäŸã¯ããã§ã¯ãããŸããïŒã
åé€åŸãçŸåšã®äººã¯åé€æžã¿ãšããŠããŒã¯ãããŸãã
private void removePerson(int indexDuplicate) { int idRemovedPerson = allPersons.get(indexCurrentUnvisitedPerson).getId(); int idDuplicate = allPersons.get(indexDuplicate).getId(); for (int i = 0; i < indexCurrentUnvisitedPerson; i++) { Person person = allPersons.get(i); person.replaceChild(idRemovedPerson, idDuplicate); } allPersons.remove(indexCurrentUnvisitedPerson); isCurrentPersonDeleted = true; }
Personã¯ã©ã¹ã§ããåã眮æã¡ãœãããè¿œå ããŸãã
public void replaceChild(int oldId, int newId) { if (oldId == newId) { return; } if (!children.contains(oldId)) { return; } children.remove((Object) oldId); setChild(newId); }
çŸåšã®äººã«åäŸãè¿œå ããããšãæ€èšããŠãã ããã
å ¥ãå£ã§ã¯ãåäŸãšããŠææ°ã«èšå®ããå¿ èŠããã人ã ã®ãªã¹ããååŸããŸãã
éè€ã®æ€çŽ¢ã®äž»ãªéãã¯ãã蚪åæžã¿ãã®äººã ãã§ãªãããæªèšªåã®ã人ã®éã§ãæ€çŽ¢ããããšã§ãã 家系å³å šäœã®äžã
çŸåšã®äººç©ãåé€ããããšãäŸå€ãã¹ããŒãããŸãã å®éãåäŸãã€ã³ã¹ããŒã«ãã人ã¯ããŸããã
åé€ãããªãå Žåã¯ããã©ã¡ãŒã¿ãŒãšããŠæž¡ããããªã¹ãã調ã¹ãŸãã åããã§ã«å®¶ç³»å³ã«å«ãŸããŠããå ŽåãèŠã€ãã£ãéè€ã®èå¥åãåã®ãªã¹ãã«è¿œå ãããŸãã åã家系å³ã«ãªãå Žåããã®èå¥åãåã®ãªã¹ãã«è¿œå ãããããã«åèªèº«ã家系å³ã®æåŸã®ã蚪åãããŠããªãã人ã®ãªã¹ãã«è¿œå ãããŸãã
ãããã£ãŠãsetChildrenïŒïŒã¡ãœããã䜿çšãããšããªã¹ãã«ãããŒã¿ãå ¥åãããŸããã
public void setChildren(List<Person> children) { if (isCurrentPersonDeleted) { throw new IllegalArgumentException( " . "); } for (Person person : children) { int index = allPersons.indexOf(person); int id; if (index >= 0) { id = allPersons.get(index).getId(); } else { allPersons.add(person); id = person.getId(); } allPersons.get(indexCurrentUnvisitedPerson).setChild(id); } }
çŸåšã®äººç©ã®ã«ãŠã³ã¿ãŒãæŽæ°ããå¿ èŠããããŸããããããªããšã家系å³ãäœæãããŸããã ããã¯æ¬¡ã®ããã«çºçããŸããçŸåšã®äººç©ãåé€ãããå Žåã次ã®ã蚪åãããŠããªãã人ç©ã¯æ¢ã«åœŒå¥³ã®å Žæã«ããã®ã§ãåé€ããã人ç©ã®ãµã€ã³ãçŸåšã®äººç©ããåã«ãåé€ãããã ãã§ååã§ãã çŸåšã®äººç©ãåé€ãããŠããªãå Žåããã¹ãŠã®ããŒã¿ããæºããããŠããããšã¿ãªãã次ã®ã蚪åãããŠããªãã人ç©ã«é²ã¿ãŸãã
public void updatingCurrentPerson() { if (isCurrentPersonDeleted) { isCurrentPersonDeleted = false; } else { indexCurrentUnvisitedPerson++; } }
ã¯ããŒã«ã¯äžä»£ããšã«å®è¡ãããŸãïŒæåã«çæã®åµå§è ïŒ0äžä»£ïŒã次ã«åœŒã®ãã¹ãŠã®åäŸïŒ1äžä»£ïŒããæ幎é·ããæ幎å°ïŒãŠã£ãããã£ã¢ã®URLããã®é åºã«ããââããšãæå³ããŸãïŒã次ã«å«ïŒ2äžä»£ïŒ ïŒïŒå¹Žé·ã®é·ç·ã®åã次ã«æ¬¡ç·ã®ããã«æ幎å°ãŸã§ïŒãgreatå«ïŒç¬¬3äžä»£ïŒãªã©ãæåŸã®çæã®ä»£è¡šè ãŸã§ã
åœç¶ããã¹ãŠãæå³ãããšããã«æ©èœããããšã確èªããããã«ããã¹ãã§ã³ãŒãã«ãã¬ããžãæ倧100ïŒ ã«ããããšãå¿ããªãã§ãã ããã ãã¹ãã®èª¬æã¯javadocã§å ¥æã§ããŸãã
ããã§èšåãã䟡å€ã®ããããšã®1ã€ã¯ãGenealogicalTreeã¯ã©ã¹ã¯éåžžã«å®å šã§ã¯ãªããããç³»å³ããªãŒçæã¢ã«ãŽãªãºã ã®å€éšïŒGenerateGenealogicalTree以å€ïŒã§äœ¿çšãããšãç°¡åã«æ£ããåäœããªãå¯èœæ§ãããããšã§ãã ãã®ç¶æ³ã§ã®å¯äžã®æ£ãã解決çã¯ãGenerateGenealogicalTreeã®å éšãã©ã€ããŒãã¯ã©ã¹ãšããŠãã®ã¯ã©ã¹ã転éããããšã§ãã ããããã¢ã«ãŽãªãºã ã®ãã¹ãã®å©äŸ¿æ§ã®ããã«ãããã¯ãŸã è¡ãããŠããŸããã
ããã°ã©ã ãå®è¡ããŸãã
çµæãããŒã¿ããŒã¹ã«èšé²ãã
æåã®å®è¡ã¯ãæå³çã«èª€ã£ãçµæãé€å€ããããã«ãäœããã®æ¹æ³ã§åæããå¿ èŠãããèšå€§ãªããŒã¿ãããããšã瀺ããŠããŸãã ä»åŸã2017幎9æ17æ¥ã«ãŠã£ãããã£ã¢ã§3448ããŒãžã®Rurikã®çŽç³»ã®åå«ãèŠã€ãã£ãããšããç¥ããããŸãã ããŒã¿ããŒã¹å ã®ãã®éã®æ å ±ãåŠçããæãç°¡åãªæ¹æ³ã
ãŸããããŒã«ã«ããŒã¿ããŒã¹ãæ¡åŒµããŸãããããgenealogicaltreeãšåŒã³ãŸãã ãã¹ã¯ãŒãã®ãªãæšæºã®rootãŠãŒã¶ãŒã§ã ããŒã¿ããŒã¹ãšå¯Ÿè©±ããã«ã¯ãæšæºã®MySQL JDBC Type 4ãã©ã€ããŒã©ã€ãã©ãªã䜿çšããŸãã
次ã«ãããŒã¿ããŒã¹ãšããåãããããã®æ°ããã¯ã©ã¹ãšãæå®ãããååã§å®¶ç³»å³ãããŒãã«ã«ä¿åããã¡ãœãããäœæããŸãã
public class MySqlHelper { private static final String url = "jdbc:mysql://localhost:3306/genealogicaltree" + "?serverTimezone=UTC&useUnicode=yes&characterEncoding=UTF-8"; private static final String user = "root"; private static final String password = ""; private static Connection connection; private static Statement statement; private static ResultSet resultSet; public static void saveTree(String tableName, List<Person> tree) throws MalformedURLException { try { connection = DriverManager.getConnection(url, user, password); statement = connection.createStatement(); String table = createTable(tableName); statement.executeUpdate(table); for (Person person : tree) { String insert = insertPerson(tableName, person); statement.executeUpdate(insert); } } catch (SQLException sqlEx) { sqlEx.printStackTrace(); } finally { try { connection.close(); } catch (SQLException se) { } try { statement.close(); } catch (SQLException se) { } } } private static String createTable(String tableName) { StringBuilder sql = new StringBuilder(); sql.append("CREATE TABLE " + tableName + " ("); sql.append("id INTEGER not NULL, "); sql.append("name VARCHAR(255), "); sql.append("url VARCHAR(2048), "); sql.append("children VARCHAR(255), "); sql.append("PRIMARY KEY ( id ))"); return sql.toString(); } private static String insertPerson(String tableName, Person person) { StringBuilder sql = new StringBuilder(); sql.append("INSERT INTO genealogicaltree." + tableName); sql.append("(id, name, url, nameUrl, children, parents, numberGeneration) \n VALUES ("); sql.append(person.getId() + ","); sql.append("'" + person.getName() + "',"); sql.append("'" + person.getUrl() + "',"); sql.append("'" + person.getChildren() + "',"); sql.append(");"); return sql.toString(); } }
çæçµæã®ä¿åã確å®ããŸãã
private static void saveResultAndQuit(GenealogicalTree tree) throws Exception { Timestamp timestamp = new Timestamp(System.currentTimeMillis()); String tableName = "generate" + timestamp.getTime(); MySqlHelper.saveTree(tableName, tree.getGenealogicalTree()); }
æåã®çµæã®åæ
GenerateGenealogicalTree.mainïŒïŒã®æåã®å®è¡ã§ã¯ãå€ãã®ã¬ã³ãŒããè¿ãããŸããããã®ã¬ã³ãŒãããã°ãã調ã¹ããšãååšããªããšã©ãŒããŒãžã®ååšãæããã«ãªããŸãã
ãšã©ãŒãã«ããŽãªã«åããŸãããïŒ
- ãã®å¹Žã¯åäŸã®ãªã¹ãã«èŒã£ãŠããŸããïŒããšãã°ã ã€ãã¹ã©ãã»ã¹ãŽã£ã¢ãã¹ã©ãŽã©ãŽã£ããã®ããŒãžã®1153 ïŒ
- éãã·ã¢èªã®èšäºïŒ ãã©ã³ã¹ã®ã¢ãã¬ãŒãããã©ã³ã¹çã«ã€7äžã®åš
- åããã«ã€7äžãããç»å Žãããäžæ£ãªåãããŒãž
- ãªã¹ãã«ãããã®ãããªå€éšããŒãžãããšãã°ã Galerand IV de Beaumontãã
- ãããŒãžãäœæããŠããŸããã ããšãã°ã ã¢ã³ãã»ãŠãªãšãŽã ã ãã¥ããçåã®åšã ãŠãŒãª ã»ã€ãã¹ã©ãŽã£ãã
æ æã«èª€ã£ãããŒãžãæé€ããããã«ãåã®ããŒãžã決å®ããgetChildrenUrlïŒïŒã¡ãœããããã¡ã€ãã©ã€ãºããŸãã ã«ããŽãª1ã«åé¡ãããªãããã«ããã«ã¯ãããã¹ãã³ã³ãã³ããæ°åã§å§ãŸããªã³ã¯ãåé€ããå¿ èŠããããŸãã ã«ããŽãª2ã«åé¡ãããªãããã«ããã«ã¯ãã¯ã©ã¹ãextiwã§ãããªã³ã¯ãåé€ããå¿ èŠããããŸãã3-4ã®ã«ããŽãªãé¿ããããã«ã芪ã¿ã°ãsupïŒä¿®é£Ÿãªã³ã¯ïŒã§ãããªã³ã¯ãé€å€ããå¿ èŠããããŸãããªã¹ãããã«ããŽãª5ãåé€ããã«ã¯ãã¯ã©ã¹ãæ°ãããªã³ã¯ãé€å€ããå¿ èŠããããŸãïŒããŒãžäœæïŒã
ãŸãããªã³ã¯ã«ãŒãã®ãã¹ãŠã®ã«ããŽãªã®ãã§ãã¯ãè¿œå ããŠãtestChildrenSizeïŒïŒãã¹ããæ¹è¯ããŸãããã
driver.navigate().to("https://ru.wikipedia.org/wiki/_"); children = page.getChildrenUrl(); assertTrue(children.size() == 3); driver.navigate().to("https://ru.wikipedia.org/wiki/_VII"); children = page.getChildrenUrl(); assertTrue(children.size() == 5); driver.navigate().to("https://ru.wikipedia.org/wiki/_IV__,___"); children = page.getChildrenUrl(); assertTrue(children.size() == 0); driver.navigate().to("https://ru.wikipedia.org/wiki/__(_)"); children = page.getChildrenUrl(); assertTrue(children.size() == 5);
ãã¹ãã¯äºæ³éãèµ€ã§ãã
getChildrenUrlïŒïŒã¡ãœãããçµäºããŸãïŒ
public List<Person> getChildrenUrl() throws MalformedURLException { waitLoadPage(); List<WebElement> childrenLinks = getChildrenLinks(); List<Person> children = new ArrayList<Person>(); for (WebElement link : childrenLinks) { if (DriverHelper.isSup(link)) { continue; } Person person = new Person(link.getAttribute("href")); person.setNameUrl(link.getText()); if (person.isCorrectNameUrl()) { children.add(person); } } return children; } private List<WebElement> getChildrenLinks() { List<WebElement> childrenLinks = DriverHelper.getElements(driver, By.xpath("//table[contains(@class, 'infobox')]//tr[th[.=':']]" + "//a[not(@class='new' or @class='extiw')]")); return childrenLinks; } private void waitLoadPage() { this.driver.findElement(By.cssSelector("#firstHeading")); } public final class DriverHelper { /** * .<br> * - , * , * , , . * , , * . */ public static List<WebElement> getElements(WebDriver driver, By by) { driver.manage().timeouts().implicitlyWait(0, TimeUnit.SECONDS); List<WebElement> result = driver.findElements(by); driver.manage().timeouts().implicitlyWait(DriverHelper.TIMEOUT, TimeUnit.SECONDS); return result; } public static boolean isSup(WebElement element) { String parentTagName = element.findElement(By.xpath(".//..")).getTagName(); return parentTagName.equals("sup"); } } public class Person { private String nameUrl; public boolean isCorrectNameUrl() { Pattern p = Pattern.compile("^[\\D]+.+"); Matcher m = p.matcher(nameUrl); return m.matches(); } }
nameUrlã¯ã芪ã®ããŒãžã«ãã人ã®ãªã³ã¯ã®ååã§ãã
ãã¹ãã®ã»ããå šäœãè¿œãè¶ããŸããã-ç·ã«å€ãããŸããã
Rurikã«ã¯ãŠã£ãããã£ã¢ã®ãã·ã¢èªããŒãžã«å°å¿µããåå«ãããããããã®ã§ãæåã«ããããæ°æã®æåã®çã§ããããã€ã«ãã§ãããŽã£ããã®ããã°ã©ã ãå®è¡ããŸããéå§ããçµäºãåŸ ã£ãŠçµæãåæããŸãã
ãããã
383 ( , , , 18 II ), , , , , II , . , , .
. :
ãããã®èª€ã£ãããŒãžã¯ãåã«å¥ã®ããŒãžããªãå Žåã®ã¢ã³ã«ãŒä»ãã®URLã®çµæã§ããã圌ã«é¢ããæ å ±ã¯ãæåã®å Žåã®ããã«èŠªã®ããŒãžã«ä¿åããããã2çªç®ã®ããã«ãã¹ãŠã®åã®å¥ã®ããŒãžã«ä¿åãããŸãã
ããªãã®ç®ãåŒãæåã®ããšã¯ãåå«ã®çæã®ãããã®ä»£è¡šè ãèªåèªèº«ãæ®ããŠããªããšããããšã§ãã ïŒãã¡ããããŸã æé·ããæéããªãã£ããªã©ã³ã¹ã³ã»ãããœãŒã®ããªãœã®åšãé€ããŠïŒå¹ŒãåäŸãšããŠäº¡ããªã£ã
ãããgetChildrenUrlïŒïŒã¡ãœãããå®å šã«å€æŽããŠãçŸåšã®URLã«ã¢ã³ã«ãŒãããå Žåã¯ç©ºã®ãªã¹ããè¿ãããšãã§ããŸããããã¯ããã¢ã³ã«ãŒããæã€äººãã芪ãšããŠã®åãåãšããŠç¢ºç«ããªãããã«ããå¿ èŠããããŸããæåã®èª€ã£ãå ¥åã®å Žåã®ããã«ãèªåã®å åŒå§åŠ¹ã
public List<Person> getChildrenUrl() { waitLoadPage(); if (DriverHelper.hasAnchor(driver)) { return new ArrayList<Person>(); } ... } public final class DriverHelper { ... public static boolean hasAnchor(WebDriver driver) throws MalformedURLException { URL url = new URL(driver.getCurrentUrl()); return url.getRef() != null; } ... }
æ°ãããã¹ããè¿œå ããã¢ã³ã«ãŒãå«ãURLãæã€äººã«åäŸãããªãããšã確èªããŸãã
@Test public void testEmptyChildrenInPersonWithAnchor() throws Exception { driver.navigate().to("https://ru.wikipedia.org/wiki/_"); PersonPage page = new PersonPage(driver); List<String> children = page.getChildrenUrl(); assertTrue(children.size() == 5); driver.navigate().to( "https://ru.wikipedia.org/wiki/_#.D0.A1.D0.B5.D0.BC.D1.8C.D1.8F"); children = page.getChildrenUrl(); assertTrue(children.size() == 0); }
ãã¹ãã»ããå šäœãåå®è¡ããŠãç ŽæããŠããªãããšã確èªããŸãã
åå«ãèšç®ãããŠããªãå Žåãã¢ã³ã«ãŒã§URLãããã²ãŒããããã€ã³ãã¯äœã§ããïŒãã¡ãããåå«ã¯ç¹å®ã§ããŸããããä»ã®æ å ±ãåŸãããšãã§ããŸãïŒäººã®ååããäŸãã°ãç幎ææ¥ããããã£ãŠãå°æ¥ã®æ©èœæ¡åŒµã®ããã«ããã®ãããªURLããä¿åãããããšããå§ãããŸãã
ãã¢ã³ã«ãŒãã«ããååã®èšç®
ãããã®ã»ãšãã©ã®å Žåã人ã®ååã¯ãã¢ã³ã«ãŒãã䜿çšããŠèšç®ã§ããŸããååã¯ããã¢ã³ã«ãŒãã®å€ã«çããèå¥åãæã€ã¿ã°ã®ããã¹ãã³ã³ãã³ãã§ãã
getNameïŒïŒã¡ãœãããå®æãããŸãïŒ
private String getName() throws MalformedURLException { waitLoadPage(); String namePage = driver.findElement(By.cssSelector("#firstHeading")).getText(); if (!DriverHelper.hasAnchor(driver)) { return namePage; } String anchor = DriverHelper.getAnchor(driver); List<WebElement> list = DriverHelper.getElements(driver, By.id(anchor)); if (list.size() == 0) { return namePage; } String name = list.get(0).getText().trim(); return name.isEmpty() ? namePage : name; } public final class DriverHelper { ... public static String getAnchor(WebDriver driver) throws MalformedURLException { URL url = new URL(driver.getCurrentUrl()); return url.getRef(); } ... }
çŸåšã®URLã«ãã¢ã³ã«ãŒããå«ãŸããŠããå Žåããã¢ã³ã«ãŒãã«çããèå¥åãæã€èŠçŽ ã®ããŒãžäžã®ååšã確èªããå¿ èŠããããŸãã以äžã®å Žåã®ããã«ãããã¯ãååšããããšã¯ã§ããŸãããã¿ãªã¢åš- ã®ããŒã¿ãŒIã®ã¯ãPeterã®ããŒãžã®ãªã³ã¯ã«ã¯ãNataliaã®ãã¢ã³ã«ãŒãã«å¯Ÿå¿ããªããæ¢ã«ååšããªããã¢ã³ã«ãŒããå«ãŸããŠããŸãã
ãŸããèå¥åãanchorããæã€ã¿ã°ã«ç©ºã§ãªãããã¹ããå«ãŸããŠããããšã確èªããããã§ãªãå Žåã¯ããŒãžåãè¿ãããšãå¿ èŠã§ããããããªããšãããšãã°Demyan Glebovichã®å Žåã®ããã«ã空ã®ååã決å®ãããããã°ã©ã ã¯äŸå€ã§ã¯ã©ãã·ã¥ããŸãã
ãã¹ãã¯åã³ç·è²ã«ãªããŸããã
ãªã³ã¯åã芪ãäžä»£çªå·ãè¿œå ãã
åé¡ã¯æ®ã£ãŠããŸãããŠã©ãžããŒã«ã»ã¢ã¬ã¯ãµã³ãããŽã£ãã®é·ç·ã¢ã¬ã¯ãµã³ããŒã®ååã¯ã家æããšå®çŸ©ãããŠããŸããããã§äœãããïŒ
人ã®ååã¯ããªã³ã¯èªäœã®èšç®äžã«ã芪ã®ããŒãžãããã®äººãžã®ãªã³ã¯ã®ã³ã³ãã³ãããèšç®ããããšãã§ããŸãã getChildrenUrlïŒïŒã¡ãœããå ããã®ååã¯ã幎ãåãªã³ã¯ã®ãªã¹ãããé€å€ãããæç¹ã§æ¢ã«èšç®ãããå€æ°nameUrlã«æ ŒçŽãããŠããŸãã
ãã¡ãããå€æŽããã³ãŒãå šäœããã¹ãã§ã«ããŒããããšãå¿ããªãã§ãã ããã
æ¹èšã®çµæãä»ã§ã¯ãã®äººã«ã¯2ã€ã®ãååããããããã®ãã¡ã®1ã€ã¯ç¢ºãã«ãåèã«ãªããã¯ãã§ããæãããªçç±ã§ãäŸå€ã¯çæã®ç¥å ã§ãããnameUrlã«ã¯äœã§ãããŸããŸããïŒæ確ã«ããããã«å€ ""ãå²ãåœãŠãŸãïŒã
Romanovsã®ããã°ã©ã ãåå®è¡ãããªãã¡ã¯ã¿ãªã³ã°åã«åéãããããŒã¿ãšããŒã¿ãæ€èšŒããŸãã
ããã¯ãã¢ã³ã«ãŒãå«ãURLã®å€èŠ³ã§ãã
id | ãåå | åã©ããã¡ | url | urlName |
---|---|---|---|---|
8 | ãã©ã®ã¢ | [] | åç § | ãã©ã®ã¢ |
9 | ããŒãµ | [] | åç § | ããŒãµ |
10 | ãœãã£ã¢ | [] | åç § | ãœãã£ã¢ |
15 | ã¢ã³ã | [] | åç § | ã¢ã³ã |
23 | ãšãŽããã¢ïŒè¥ãïŒ | [] | åç § | ãšãŽãã㢠|
26 | ã»ãªãã© | [] | åç § | ã»ãªãã© |
28 | ããªã¢ | [] | åç § | ããªã¢ |
29æ¥ | ããªãã·ãŠã¹ | [] | åç § | ããªãã·ãŠã¹ |
36 | ããŒã¿ãŒIã®åäŸ | [] | åç § | ãã¿ãªã¢ |
133 | 家æ | [] | åç § | ã¢ã¬ããµã³ã㌠|
360 | çµå©ãšåäŸ | [] | åç § | ã«ã¢ãã»ãªã©ã³ã¹ã³ã»ãããœãŒ |
ãªã³ã¯ã®ååãè¿œå ããŠãããã¬ãŒã¹ãªãã§ã¯ãã¹ããŸããã§ããã Rurikã®ããã°ã©ã ã®å®è¡ã¯ãnameUrlã«ã¢ãã¹ãããã£ãæã€å€ "Henry II d'Albre"ãå«ãŸããŠãããããHenry IIïŒKing of NavarreïŒã®insertã¹ããŒãã¡ã³ãã®éåãé€ããäºæããã¯ã©ãã·ã¥ããŸããã Personã¯ã©ã¹ã®setNameããã³setNameUrlã¡ãœãããæ¹è¯ããæå®ãããå€ãã¢ãã¹ãããã£ãªãã§ä¿åããŸãã
ãŠã£ãããã£ã¢ã«ã¯ãRurikã®çŽ3äž5å人ã®åå«ãããããšãæãåºãããŠãã ããããã®æ å ±ãè¡šã«è¡šç€ºãããšãéåžžã«å€§ããªããŒãžã衚瀺ãããŸãã¹ã¯ããŒã«ã«ããããããŸãããã¬ãŒãå šäœãèŠãã ãã§ãªããäžãããã代衚è ãšçæã®ç¥å ãšã®ã€ãªããã匷調ããæ©äŒãããããšïŒã€ãŸããäžãããã代衚è ã®ç¥å ãŸã§ã®ãã¹ãŠã®ç¥å ãéžæããããšïŒã¯èå³æ·±ãã§ãããããŸãã圌ãã©ã®ãããªäžä»£ã§ããããç¥ãããšãã§ããŸãã
ãã®æ°ããæ©èœãå®è£ ããããããããã«ãPersonã¯ã©ã¹ã«äžä»£çªå·ãšèŠªã®ãªã¹ãã®ãã£ãŒã«ããè¿œå ããŸãïŒå¢å ããé¢ä¿ãæ§ç¯ããããããããïŒã
private List<Integer> parents = new ArrayList<Integer>(); private int numberGeneration = 0; public void setParent(int parent) { parents.add(parent); } public void setNumberGeneration(int numberGeneration) { if (this.numberGeneration == 0) { this.numberGeneration = numberGeneration; } }
ã»ãšãã©ã®å Žåã芪ã¯1ã€ã§ãããäž¡æ¹ã®èŠªãç°ãªããã©ã³ãããã®çæã®ç¥å ã®åå«ã§ããããã®åŸã2ã€ã®èŠªãååšããå ŽåããããŸãããšã©ãŒã®äŸã¯ã3人ãåã人ã®èŠªïŒæåã2çªç®ã3çªç®ããå ±éãã®åãããã³ãã¹ãŠã®ã«ãªã³ãããïŒãäžåºŠã«ãæã£ãŠãããå Žåã«ãäžããããŸããããã¡ãããççåŠçã«ã¯ããã¯äžå¯èœã§ãããã¢ããŒãã®ããã«å€æããŸãããæ®å¿µãªããã誰ããäœåãã§ããããèªåçã«å€æããããšã¯ã§ããªããããå šå¡ãæãå¿ èŠããããŸãã
æããã«ã芪ã®ãªã¹ãã«ã¯çæã®ä»£è¡šè ããååšã§ãããç¥å ãŸã§ã®çæã®ä»£è¡šè ã®ãã¹ãŠã®ç¥å ããåéãããã®ã¯éåžžã«ç°¡åã§ããååã¯ãã®æ å ±ã«ãããŸããã
èã®æ°ã«ã€ããŠã¯ãæåã®èŠªããäžåºŠã ãèšå®ãããŸããåãåç §ãã2çªç®ã®èŠªã衚瀺ãããç¬éãäžä»£çªå·ã¯æŽæ°ãããªããªããŸãããªããªãè¡çµ±ããªãŒãäžä»£ã«ãã£ãŠãã©ããŒã¹ãããå Žåãæåã®èŠªã®äžä»£çªå·ãæåã®èŠªã®èçªå·ä»¥äžã«ãªãããšã¯æããã§ããã€ãŸãããæåã®èŠªããä»ããŠæ¥ç¶ãæ§ç¯ããæ¹ãè¿ éã§ãã
GenerateGenealogicalTreeã¯ã©ã¹ã®setChildrenïŒList <Person> childrenïŒã¡ãœããã§äžä»£çªå·ãšèŠªIDãèšå®ããŸãã
public void setChildren(List<Person> children) { if (isCurrentPersonDeleted) { throw new IllegalArgumentException( " . "); } Person currentPerson = allPersons.get(indexCurrentUnvisitedPerson); int numberGeneration = currentPerson.getNumberGeneration(); numberGeneration++; int idParent = currentPerson.getId(); for (Person person : children) { int index = allPersons.indexOf(person); int id; if (index >= 0) { // , allPersons.get(index).setParent(idParent); id = allPersons.get(index).getId(); } else { // person.setNumberGeneration(numberGeneration); person.setParent(idParent); allPersons.add(person); id = person.getId(); } currentPerson.setChild(id); } }
ãã¡ãããã³ãŒãå šäœããã¹ãã§ã«ããŒããããšãå¿ããªãã§ãã ãã-ãããããã«è¡ãããªããšãã³ãŒãã®æ··ä¹±ãææ¡ããã®ãé£ãããªããŸãã
æçµçµæ
ããã€ãã®ç³»çµ±æš¹ã圢æããçµæãèŠãæãæ¥ãŸããïŒ
ã¢ãã -å°çäžã§æåã®äºº
ãžã³ã®ã¹ã«ã³-
ããããŽã¡ã»
ã«ãªã³ãŽã£ããïŒ3452人ãé·ãééããŠããïŒã®æŽå²ã®äžã§æãå倧ãªåŸæè ã
ããŒãžã®èª¬æïŒ
aïŒååãã¯ãªãã¯ãããšãWikipediaã®äººã®ããŒãžãéããŸã;
bïŒ[ããã]ãã¯ãªãã¯ãããšãæå®ãã人ãšå ç¥ã®ã€ãªããã®ããŒãžãéããŸããããšãã°ãè±åœã®ãšãªã¶ãã¹å¥³ç2äžãRurikã®29代ç®ã®åå«ã§ããããšã蚌æããããŒãžããããŸãã
cïŒèŠªãšåã®ãã£ãŒã«ãã®èå¥åãã¯ãªãã¯ãããšãããŒãžããã®äººã®è¡ã«ã¹ã¯ããŒã«ããŸãã
çµæã¯ãäŸãã°ãæåŸã®ãã·ã¢çåžããã³ã©ã¹2äžã¯ã28代ç®ã®ã«ãŒãªãã¯ã®åå«ã§ãããããã«ãããŒã¿ãŒIIIãšãã£ãµãªã³IIããå§ãŸããã¹ãŠã®ãã·ã¢çåžã¯ãç°ãªãæ¯éšã®ã«ãŒãªãã¯ã®åå«ã§ããã
ãããžã§ã¯ã
PS 24-09-2017 ã®ãœãŒã¹ã³ãŒã
ããªãŒã®å®è£
ããªãŒå ã®ããŒã¿ãèŠèŠåããããã«ãInfoVis Toolkit JavaScriptã©ã€ãã©ãªãŒã䜿çšããŸããã
ãªã¹ãã§ã¯ãªããããªãŒã®åœ¢ã§ããªãŒã®ç³»å³ãžã®ãªã³ã¯ïŒ
Adam
Genghis Khan
Romanovs
Rurikovich
PS 10-22-2017
ãŠã£ãããŒã¿ã䜿çšããããªãŒçæ
ã³ã¡ã³ããæ£ããä¿ãããã®ã§ãWikidataãçæã«äœ¿çšããããšããå§ãããŸããæ¹åã¯å°ããããšãå€æããŸããã詳现ã«ã€ããŠã¯ããã¡ããã芧ãã ããã
çµæã¯æ¬¡ã®ãšããã§ãã
ã¢ãã -31人ã§ã¯ãªã243人ã®
ãžã³ã®ã¹ã«ã³ -33人ã§ã¯ãªã405人ã®ä»£è¡š