Карты не работают некоторые клавиши


Я внедряю TreeMap в java сегодня, чтобы отслеживать навигацию для следующей страницы. У меня есть 5 записей в карте деревьев, 3 из них работают, а 2 не работают.

NavigationHelper.java:

public class NavigationHelper {

private static String hhSection = HXConstants.CSR_SECTION_FAMILY_DETAILS;
private static String[] hhPages = {
        HXConstants.CSR_PAGE_ID_HOUSEHOLD_MEMBERS, 
            HXConstants.CSR_PAGE_ID_HOUSEHOLD_RELATIONSHIP, 
                HXConstants.CSR_PAGE_ID_HOUSEHOLD_ADDITIONAL_QUESTIONS,
                    HXConstants.CSR_PAGE_ID_HOUSEHOLD_SUMMARY_NEW,
                        HXConstants.CSR_PAGE_ID_HOUSEHOLD_PRIVACY_AGREEMENT
};
private static String hhPath = "household";
public static HashMap<String, NavLocation> getHHNavMap()
{

    HashMap<String, NavLocation> hhNavMap = new HashMap<String, NavLocation>();
    for (int i=0;i<hhPages.length;i++ ) {
        hhNavMap.put(hhPath+"/"+hhPages[i], new NavLocation(hhSection,hhPages[i]));
    }
    return hhNavMap;
}

public static Map<NavLocation,String> getHHBackNavMap() {
    TreeMap<NavLocation,String> hhBackNavMap = new TreeMap<NavLocation, String>();
    HashMap<String, NavLocation> hhNavMap = getHHNavMap();
    for(Entry<String, NavLocation> entry : hhNavMap.entrySet()) {
        hhBackNavMap.put(entry.getValue(), entry.getKey());
    }
    return hhBackNavMap;
}


public static class NavLocation implements Comparable<NavLocation>{
    private String section;
    public NavLocation(String s, String p) {
        this.section = s;
        this.page = p;
    }
    public String getSection() {
        return section;
    }

    public String getPage() {
        return page;
    }
    private String page;

    @Override
    public int compareTo(NavLocation navObj) {
        if(navObj.getPage().equals(this.page) && (navObj.getSection().equals(this.section)))
            return 0;
        return 1;
    }

}
}

AppAggNavigationHelper.java:

public class AppAggNavigationHelper extends RestServiceBaseTest {

private static String hhSection = HXConstants.CSR_SECTION_FAMILY_DETAILS;
private static String[] hhPages = {
        HXConstants.CSR_PAGE_ID_HOUSEHOLD_MEMBERS, 
            HXConstants.CSR_PAGE_ID_HOUSEHOLD_RELATIONSHIP, 
                HXConstants.CSR_PAGE_ID_HOUSEHOLD_ADDITIONAL_QUESTIONS,
                    HXConstants.CSR_PAGE_ID_HOUSEHOLD_SUMMARY_NEW,
                        HXConstants.CSR_PAGE_ID_HOUSEHOLD_PRIVACY_AGREEMENT
};

NavigationHelper navigationHelper = new NavigationHelper();
List<NavLocation> navList = new ArrayList<NavLocation>();

@Before
public void populateNavLocations() {
    for(int i = 0 ; i < hhPages.length ; i++) {
        navList.add(new NavLocation(hhSection, hhPages[i]));
    }
}

@Test
public void test() {
    testWithoutRest();
}



public void testWithoutRest() {
    TreeMap<NavLocation,String> map = (TreeMap<NavLocation, String>) navigationHelper.getHHBackNavMap();
    for(Map.Entry<NavLocation, String> entry : map.entrySet()) {
        NavLocation nav = entry.getKey();
        System.out.println(nav.getPage() + " " + nav.getSection());
        System.out.println(entry.getValue());

    }
    p("*****");
    for(NavLocation navLocation : navList) {
        System.out.println(navLocation.getPage() + " " + navLocation.getSection() + " " + map.get(navLocation));
    }
}
}

Тогда выход подключен, для члена, резюме, конфиденциальности он работает. Но для отношений и вопросов это не так. :

member familydetails household/member

relation familydetails null

question familydetails null

summary familydetails household/summary

privacy familydetails household/privacy

Почему отношение и вопрос не работают?

1 2

1 ответ:

Ваш метод compareTo сломан. Если два объекта NavLocation, a и b отличаются по своей странице или разделу, то оба объекта a.compareTo(b) и b.compareTo(a) вернут 1, нарушив тем самым общий контракт метода, что может привести к неожиданным результатам.

Вместо этого классический способ реализации такого метода в зависимости от свойств объектов, вероятно, будет выглядеть примерно так:
@Override
public int compareTo(NavLocation other) {
    int result = getPage().compareTo(other.getPage());
    if (result != 0) {
        return result;
    }

    return getSection().compareTo(other.getSection());
}