01/10/2018, 15:48

Sắp xêp dựa trên nhiều tiêu chí trong java

Có bài toán như sau:


Tronh đó tiêu chí săp sếp dự trên 3 yêu tố: điểm, hiệu số bàn thắng, số bàn thắng.
Có cách làm như sau để cho anh em dễ mở rộng sau này(dùng Comparator):
Tạo class PointComparator(so sánh dự trên điểm)

package pet.utils;
import java.util.Comparator;

import pet.obj.FootballClub;
// TODO: Auto-generated Javadoc

/**
 * The Class PointComparator.
 *
 * @author NGUYENCA
 */
public class PointComparator implements Comparator<FootballClub> {

	/* (non-Javadoc)
	 * @see java.util.Comparator#compare(java.lang.Object, java.lang.Object)
	 */
	@Override
	public int compare(FootballClub o1, FootballClub o2) {
		return o2.getStandingData().getPoint() - o1.getStandingData().getPoint();
	}

}

class GoalDifComparator(hiệu số)

package pet.utils;
import java.util.Comparator;

import pet.obj.FootballClub;

// TODO: Auto-generated Javadoc
/**
 * The Class GoalDifComparator.
 *
 * @author NGUYENCA
 */
public class GoalDifComparator implements Comparator<FootballClub> {

	/* (non-Javadoc)
	 * @see java.util.Comparator#compare(java.lang.Object, java.lang.Object)
	 */
	@Override
	public int compare(FootballClub o1, FootballClub o2) {
		return o2.getStandingData().getGoalDif() - o1.getStandingData().getGoalDif();
	}
}


class GoalForComparator(bàn thắng)

package pet.utils;
import java.util.Comparator;

import pet.obj.FootballClub;

// TODO: Auto-generated Javadoc
/**
 * The Class GoalForComparator.
 *
 * @author NGUYENCA
 */
public class GoalForComparator implements Comparator<FootballClub> {

	/* (non-Javadoc)
	 * @see java.util.Comparator#compare(java.lang.Object, java.lang.Object)
	 */
	@Override
	public int compare(FootballClub o1, FootballClub o2) {
		return o2.getStandingData().getGoalFor() - o1.getStandingData().getGoalFor();
	}
}

Sau đó viết một class mới để control việt sử dùng 3 tiêu chí săp sếp trên:
class FootballClubChainedComparator

package pet.utils;

import java.util.Arrays;
import java.util.Comparator;
import java.util.List;

import pet.obj.FootballClub;

// TODO: Auto-generated Javadoc
/**
 * The Class FootballClubChainedComparator.
 *
 * @author NGUYENCA
 */
public class FootballClubChainedComparator implements Comparator<FootballClub> {

	/** The list comparators. */
	private List<Comparator<FootballClub>> listComparators;

	/**
	 * Instantiates a new football club chained comparator.
	 *
	 * @param comparators the comparators
	 */
	@SafeVarargs
	public FootballClubChainedComparator(Comparator<FootballClub>... comparators) {
		this.listComparators = Arrays.asList(comparators);
	}

	/* (non-Javadoc)
	 * @see java.util.Comparator#compare(java.lang.Object, java.lang.Object)
	 */
	@Override
	public int compare(FootballClub o1, FootballClub o2) {
		for (Comparator<FootballClub> comparator : listComparators) {
			int result = comparator.compare(o1, o2);
			if (result != 0) {
				return result;
			}
		}
		return 0;
	}

}

Ở đây thực chất chỉ loop trên arrayList chứa các tiêu chi săp xếp có kiểu Comparator<FootballClub.
Cách gọi như dưới:

Collections.sort(footballClubs, new FootballClubChainedComparator(new PointComparator(),
				new GoalDifComparator(), new GoalForComparator()));

Chúc anh em cuối tuần vui

Bài liên quan
0