Java Complex Coding Problem