【菜鳥學Java】8:List實體集合中保證產品名稱不重複

連江偉發表於2016-01-15

問題背景

        在做APP的嵌入頁面的時候,部長給提了這麼一個需求,需要從生產資訊的檢視中查詢出每種產品中已經成熟的一條資訊,為了更好的顯示效果。簡單的說,就是黃瓜和茄子分別被種植在1號大棚和2號大棚裡,這樣就會產生4條種植資訊,我們想要的結果是按照產品名稱檢索每個產品名稱下的任意一條種植資訊即可。比如,黃瓜的種植資訊有兩條,隨便拿出來一條,茄子亦如此,那麼我們想要的結果就是兩條(不指定是哪兩條,隨意)。

問題分析

        剛開始我想到的辦法是,通過編寫SQL語句實現,於是就在SQL Server中開始試驗

       首先將所有符合情況的記錄查詢出來

<span style="font-size:18px;"> select * from dbo.sn_plant_product_view where catename ='加工類' andnowplant =0 and harveststate =1</span>

       

        然後再使用group by子句將不重複的產品名稱查詢出來,

<span style="font-size:18px;">select pdtname  from dbo.sn_plant_product_view where catename='加工類' and nowplant =0 and harveststate =1 group by pdtname</span>

        

       最後在進行組合查詢的時候,發現使用拼接SQL語句的方式行不通,無論我怎樣寫,返回的都是全部的結果,原因是什麼呢?原因就是group by只能將資料進行分組操作,但是無法完成在每組中取一條記錄的操作,換句話說,使用SQL語句,只能進行分組操作,不能為你完成在每一組資料中任取一條記錄的工作。當然我們可以對group by分組結果進行統計和計算,比如統計每組資料的條數等等。

       至於我想要的效果只能通過寫演算法實現了,於是開始思考如何寫程式來實現。其實只要對上述的兩個結果進行比較篩選,即可得到想要的結果。

問題解決:

        經過簡單的分析,之後,便將方法寫完了,測試了一下可以解決問題,程式碼如下:

public List<SnPlantProductView> listForApp(String catename){
		
		//1.首先將結果集中不重複的產品名稱查詢出來
		String hql ="select pdtname from SnPlantProductView where catename= ? and nowplant=0 and harveststate=1 group by pdtname";
		List<String> listName=super.listByHql(hql, catename);
		
		//2.將符合查詢條件的所有記錄查詢出來
		Finder finder = Finder.create("from SnPlantProductView ");
		finder.append(" where catename =:catename and nowplant=0 and harveststate = 1");
		finder.setParam("catename", catename);
		List<SnPlantProductView> list = listByFinder(finder);
		
		//3.宣告一個實體LIst集合變數,用於存放不重複的結果記錄
		List<SnPlantProductView> resultList=new ArrayList<SnPlantProductView>();
		
		//4.使用兩重for迴圈將結果集中任意一條匹配listName集合中的名稱的記錄拿出來,放入resultList集合中
		for(int i=0;i< listName.size();i++){
			for(int j=0;j<list.size();j++){
				/*
				 * 只要list集合中有記錄的產品名稱和listName集合中的名稱匹配,
				 * 就將這條記錄放入resultList中,並且跳出當前迴圈,取下一個名稱進行匹配
				 * 直到遍歷所有的名稱,這時候,resultList中的記錄數和listName中的記錄數
				 * 是一樣的,這樣就達到了去重複的目的
				 */
				if(listName.get(i).equals(list.get(j).getPdtname())){
					resultList.add(list.get(j));
					break;
				}
				
			}
		}

		return resultList;
	}

小結一下

        其實我的辦法還是有缺陷的,如果資料量非常的大,會出現效能瓶頸,兩重For迴圈,在大資料量的情況下,會消耗很長的時間,進行匹配,最終才能返回結果,速度上就會大打折扣。我知道還有其他的辦法,只是我還想不出來,如果大神們有什麼更好的解決方案,請不吝賜教。


相關文章