Collections.sort() 在嵌套的 属性 值上
Collections.sort() on nested property values
我正在研究数据的排序功能 table。我有 JSF Web 控制器:
@Named
@ViewScoped
public class SearchPlayerController implements Serializable {
private List<Player> playerList;
@EJB
PlayerFacade playerFacade;
@PostConstruct
public void init() {
if (playerList == null) {
playerList = playerFacade.findAll();
}
}
// getters and setters
*
*
*
}
在这个控制器中我有一个排序方法:
public String sortDataByClubName(final String dir) {
Collections.sort(playerList, (Player a, Player b) -> {
if(a.getClubId().getClubName()
.equals(b.getClubId().getClubName())) {
return 0;
} else if(a.getClubId().getClubName() == null) {
return -1;
} else if(b.getClubId().getClubName() == null) {
return 1;
} else {
if(dir.equals("asc")) {
return a.getClubId().getClubName()
.compareTo(b.getClubId().getClubName());
} else {
return b.getClubId().getClubName()
.compareTo(a.getClubId().getClubName());
}
}
});
return null;
}
在页面视图上调用排序后,抛出 NullPointerException
。我认为主要原因是在 Comparator
内部它无法读取在获取 Club 对象后应该可以访问的 clubName
的值。是否有可能比较嵌套属性的值?
您似乎只在 Player.getClubId().getClubName()
上排序。似乎应该检查 getClubId()
和 getClubName()
是否为空。我会这样做:
public class PlayerComparator implements Comparator<Player> {
private String dir; // Populate with constructor
public int compare(Player a, Player b) {
int result = nullCheck(a.getClubId(), b.getClubId());
if(result != 0) {
return result;
}
String aname = a.getClubId().getClubName();
String bname = b.getClubId().getClubName();
result = nullCheck(aname, bname);
if(result != 0) {
return result;
}
result = aname.compareTo(bname);
if("asc".equals(dir)) { // No NPE thrown if `dir` is null
result = -1 * result;
}
return result;
}
private int nullCheck(Object a, Object b) {
if(a == null) { return -1; }
if(b == null) { return 1; }
return 0;
}
}
我正在研究数据的排序功能 table。我有 JSF Web 控制器:
@Named
@ViewScoped
public class SearchPlayerController implements Serializable {
private List<Player> playerList;
@EJB
PlayerFacade playerFacade;
@PostConstruct
public void init() {
if (playerList == null) {
playerList = playerFacade.findAll();
}
}
// getters and setters
*
*
*
}
在这个控制器中我有一个排序方法:
public String sortDataByClubName(final String dir) {
Collections.sort(playerList, (Player a, Player b) -> {
if(a.getClubId().getClubName()
.equals(b.getClubId().getClubName())) {
return 0;
} else if(a.getClubId().getClubName() == null) {
return -1;
} else if(b.getClubId().getClubName() == null) {
return 1;
} else {
if(dir.equals("asc")) {
return a.getClubId().getClubName()
.compareTo(b.getClubId().getClubName());
} else {
return b.getClubId().getClubName()
.compareTo(a.getClubId().getClubName());
}
}
});
return null;
}
在页面视图上调用排序后,抛出 NullPointerException
。我认为主要原因是在 Comparator
内部它无法读取在获取 Club 对象后应该可以访问的 clubName
的值。是否有可能比较嵌套属性的值?
您似乎只在 Player.getClubId().getClubName()
上排序。似乎应该检查 getClubId()
和 getClubName()
是否为空。我会这样做:
public class PlayerComparator implements Comparator<Player> {
private String dir; // Populate with constructor
public int compare(Player a, Player b) {
int result = nullCheck(a.getClubId(), b.getClubId());
if(result != 0) {
return result;
}
String aname = a.getClubId().getClubName();
String bname = b.getClubId().getClubName();
result = nullCheck(aname, bname);
if(result != 0) {
return result;
}
result = aname.compareTo(bname);
if("asc".equals(dir)) { // No NPE thrown if `dir` is null
result = -1 * result;
}
return result;
}
private int nullCheck(Object a, Object b) {
if(a == null) { return -1; }
if(b == null) { return 1; }
return 0;
}
}