package com.plectix.simulator.speciesenumeration.util; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.List; public class Entry { private String type; private String weight; private String data; private List<String> listData = new ArrayList<String>(); private int index; private List<String> dataList; public Entry(String _type, String _weight, String _data) { this.type = _type; this.weight = _weight; this.data = _data; parseEntry(); } public String getType() { return type; } public String getWeight() { return weight; } public String getData() { return data; } public List<String> getListData() { return listData; } @Override public boolean equals(Object aEntry) { if (this == aEntry) return true; if (aEntry == null) return false; if (getClass() != aEntry.getClass()) return false; Entry entry = (Entry) aEntry; return equalsWithThis(entry); } private boolean equalsWithThis(Entry entry) { if (listData.size() != entry.getListData().size()) return false; if (data.equals(entry.data)) return true; List<String> listNode = saveIndex(entry.listData); replaceNodeSitesAndCreateDataList(listNode); StringBuffer tmp1 = new StringBuffer(); StringBuffer tmp2 = new StringBuffer(); for (String dataComponent : dataList) { tmp1.append(dataComponent); } for (String dataComponent : entry.listData) { tmp2.append(dataComponent); } final boolean isEqualString = tmp1.toString().equals(tmp2.toString()); return isEqualString; } private void parseEntry() { createRawListData(); sortList(listData); } private List<String> saveIndex(List<String> aListData) { List<String> listNode = new ArrayList<String>(); for (String elements : aListData) { String step1This[] = elements.split("[(]"); if (step1This.length == 2) { String step1aThis[] = step1This[1].split("[)]"); String step2This[] = step1aThis[0].split(","); for (String element : step2This) { String step3This[] = element.split("!"); if (step3This.length == 2) { listNode.add(step3This[1]); } } } } return listNode; } private void replaceNodeSitesAndCreateDataList(List<String> listNode) { dataList = new ArrayList<String>(); index = 0; for (String elements : listData) { String step3This[] = elements.split("[(]"); if (step3This.length == 2) { StringBuffer component = new StringBuffer(); component.append(step3This[0] + "("); String step3aThis[] = step3This[1].split("[)]"); String step4This[] = step3aThis[0].split(","); List<String> componentInside = new ArrayList<String>(); for (String element : step4This) { String step5This[] = element.split("!"); if (step5This.length == 2) { String newElement = step5This[0] + "!" + getIndex(listNode); componentInside.add(newElement); } else { componentInside.add(element); } } for (String componentInsideString : componentInside) { component.append(componentInsideString + ","); } component.delete(component.length() - 1, component.length()); component.append(")"); dataList.add(component.toString()); } } } private String getIndex(List<String> listNode) { if (index >= listNode.size()) { return ""; } String result = listNode.get(index); index++; return result; } private void createRawListData() { String[] step1This = this.data.split("[)],"); for (String elementStep1 : step1This) { String[] subStep1 = elementStep1.split("[)]"); String[] step2 = subStep1[0].split("[(]"); String literStep2 = step2[0]; String[] sites = step2[1].split(","); List<String> sitesList = new ArrayList<String>(); sortSites(sites, sitesList); StringBuffer newElement = new StringBuffer(); newElement.append(literStep2); newElement.append("("); for (String site : sitesList) { newElement.append(site); newElement.append(","); } newElement.delete(newElement.length() - 1, newElement.length()); newElement.append(")"); listData.add(newElement.toString()); } } private void sortList(List<String> list) { Collections.sort(list, new Comparator<String>() { @Override public int compare(String o1, String o2) { String[] subElements1 = o1.split("[(]"); String[] subElements2 = o2.split("[(]"); String liter1 = subElements1[0]; String liter2 = subElements2[0]; final int compareLiter = liter1.compareTo(liter2); if (compareLiter == 0) { int amount1 = calcNumIndex(subElements1[1]); int amount2 = calcNumIndex(subElements2[1]); final int compareAmountIndex = String.valueOf(amount1) .compareTo(String.valueOf(amount2)); if (compareAmountIndex == 0) { String sites1 = sitesStringWhithoutNumber(subElements1[1]); String sites2 = sitesStringWhithoutNumber(subElements2[1]); final int compareSitesWhithoutIndex = sites1 .compareTo(sites2); if (compareSitesWhithoutIndex == 0) { return subElements1[1].compareTo(subElements2[1]); } return compareSitesWhithoutIndex; } return compareAmountIndex; } return compareLiter; } private int calcNumIndex(String elements) { String[] sites1 = elements.split("[)]"); String[] sites = sites1[0].split(","); int count = 0; for (String site : sites) { String[] node = site.split("!"); if (node.length == 2) { count++; } } return count; } private String sitesStringWhithoutNumber(String elements) { String[] sites1 = elements.split("[)]"); String[] sites = sites1[0].split(","); StringBuffer newSitesString = new StringBuffer(); for (String site : sites) { String[] node = site.split("!"); newSitesString.append(node[0]); newSitesString.append(","); } newSitesString.delete(newSitesString.length() - 1, newSitesString.length()); return newSitesString.toString(); } }); } private void sortSites(String[] sites, List<String> sitesList) { for (String site : sites) { sitesList.add(site); } Collections.sort(sitesList, new Comparator<String>() { @Override public int compare(String o1, String o2) { String[] siteSub1 = o1.split("!"); String[] siteSub2 = o2.split("!"); String literSite1 = siteSub1[0]; String literSite2 = siteSub2[0]; final int compareLiter = literSite1.compareTo(literSite2); if (compareLiter == 0) { String numNode1 = String.valueOf(siteSub1.length - 1); String numNode2 = String.valueOf(siteSub2.length - 1); final int compareNode = numNode1.compareTo(numNode2); return compareNode; } return compareLiter; } }); } }