大數據處理中的任務分配問題

遇到一個題目大約是這樣的:一個任務分配系統,其中的worker進程同時只能處理一個任務且任務不能中斷。
//Worker.java
import java.util.ArrayList;
import java.util.List;

public class Worker 
{
	private int iIndex;
	private int iSum;
	private List<Integer> listJobs;
	
	public Worker( int iIndex, int iSum )
	{
		this.iIndex = iIndex;
		this.iSum = iSum;
		
		listJobs  = null;
	}
	
	public int getiIndex() {
		return iIndex;
	}
	public void setiIndex(int iIndex) {
		this.iIndex = iIndex;
	}
	public int getiSum() {
		return iSum;
	}
	public void setiSum(int iSum) {
		this.iSum = iSum;
	}

	public void addJob( int iJob )
	{
		if( listJobs == null )
		{
			listJobs = new ArrayList<Integer>();
		}
		
		listJobs.add( new Integer( iJob ));
		iSum += iJob;
	}

	public List<Integer> getListJobs() {
		return listJobs;
	}

	@Override
	public String toString() {
		return "Worker [iIndex=" + iIndex + ", iSum=" + iSum + ", listJobs=" + listJobs + "]";
	}
	
}


//DWork.java
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;


public class DWork {
	
	
	public static int doWork( int iSrvCnt, int[] arrWorks )
	{
		if( iSrvCnt <= 0 )
			return -1;
		
		Arrays.sort( arrWorks );

		if( arrWorks[0] <= 0 )
		{
			return -2;
		}
		
		List<Worker> listWorkers = new ArrayList<Worker>(iSrvCnt);
		
		int i;
		for( i = 0; i < iSrvCnt; ++i )
		{
			listWorkers.add( new Worker( i, 0 ));
		}
		
		Worker minWorker = null;
		for( i = arrWorks.length - 1; i >= 0; --i )
		{
			minWorker = Collections.min(listWorkers, new Comparator(){
	
				@Override
				public int compare(Object o1, Object o2) {
					Worker w1 = (Worker)o1;
					Worker w2 = (Worker)o2;
					
					if( w1.getiSum() < w2.getiSum() )
					{
						return -1;
					}
					else if( w1.getiSum() > w2.getiSum())
					{
						return 1;
					}
					
					return 0;
				}
				
			});
			
			minWorker.addJob( arrWorks[i]);
		}
		
		minWorker = Collections.max(listWorkers, new Comparator(){
			
			@Override
			public int compare(Object o1, Object o2) {
				Worker w1 = (Worker)o1;
				Worker w2 = (Worker)o2;
				
				if( w1.getiSum() < w2.getiSum() )
				{
					return -1;
				}
				else if( w1.getiSum() > w2.getiSum())
				{
					return 1;
				}
				
				return 0;
			}
			
		});
		
		for( i = 0; i < listWorkers.size(); ++i )
		{
			System.out.println( listWorkers.get(i ).toString() );
		}
		return minWorker.getiSum();
	}
	
	public static void main(String[] args) 
	{
		int[] arrWorks = new int[5];
		
		arrWorks[0] = 9;
		arrWorks[1] = 3;
		arrWorks[2] = 10;
		arrWorks[3] = 5;
		arrWorks[4] = 1;
		
		System.out.println( DWork.doWork(3, arrWorks) );
		
	}

}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章