【菜鳥學Java】8:List實體集合中保證產品名稱不重複
問題背景:
在做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迴圈,在大資料量的情況下,會消耗很長的時間,進行匹配,最終才能返回結果,速度上就會大打折扣。我知道還有其他的辦法,只是我還想不出來,如果大神們有什麼更好的解決方案,請不吝賜教。
相關文章
- Java集合從菜鳥到大神演變Java
- 菜鳥學Java(六)——簡單驗證碼生成(Java版)Java
- 菜鳥學Java(二十三)——Java記憶體分析Java記憶體
- 菜鳥學Java(十七)——Jboss瘦身Java
- 菜鳥學Java(十八)——異常Java
- 菜鳥學Java(十六)——Jboss簡介Java
- 菜鳥學Java(十一)——GET與POSTJava
- 【菜鳥學Java】11:Session技術JavaSession
- 【菜鳥學Java】10:Cookie技術JavaCookie
- 【菜鳥學Java】4:Servlet 技術JavaServlet
- 菜鳥學Java(十四)——Java反射機制(一)Java反射
- 菜鳥學Java(十五)——Java反射機制(二)Java反射
- 菜鳥學Java(九)——Servlet的基本配置JavaServlet
- 菜鳥學Java(十)——分頁查詢Java
- java集合-ListJava
- Java 集合 ListJava
- java菜鳥入門Java
- 菜鳥學Java(四)——JSP內建物件JavaJS物件
- Java8 新特性 Stream流操作List集合 (二)Java
- 【菜鳥學Java】7:JSP的基本語法JavaJS
- 【菜鳥學Java】2:初識J2EEJava
- 菜鳥初學Java的備忘錄(二) (轉)Java
- 菜鳥初學Java的備忘錄(五) (轉)Java
- 菜鳥初學Java的備忘錄(八) (轉)Java
- 菜鳥初學Java的備忘錄(七) (轉)Java
- 菜鳥初學Java的備忘錄(九) (轉)Java
- 菜鳥初學Java的備忘錄(四) (轉)Java
- 菜鳥初學Java的備忘錄(六) (轉)Java
- 菜鳥初學Java的備忘錄(十) (轉)Java
- 菜鳥初學Java的備忘錄(一) (轉)Java
- 菜鳥初學Java的備忘錄(三) (轉)Java
- 【備忘】Java菜鳥到大牛學習路線之實戰篇Java
- IT菜鳥的學習生活
- Java基礎之去除List集合中的重複元素Java
- Java集合List隨堂Java
- 【java】【集合】List、ListIterator、VectorJava
- Java集合體系總結 Set、List、Map、QueueJava
- Java菜鳥到大牛學習路線培訓教程Java