2013年10月18日 星期五

[Java]大樂透程式-使用Set

昨天去面試的時候有考到一題,請你寫出大樂透的程式
因為寫的太慢才寫到前面面試的人就進來了
後來他看了我的code覺得用for迴圈不好啦~吧啦吧啦
以效率的觀點來看用for迴圈的確不太好
我想到的方法,亂數產生數字存到陣列前還得去檢查是否有重複的數字
這又要一個迴圈去檢查是否重複,複雜度可能會是O(n^2)
後來回來想到其實數字不重複的特性不就是Set嗎?
所以就寫了下面的程式 我利用Set擁有相同元素不收集的特性
在lottery class中重新定義equals()跟hashCode()
因為Java要判斷物件是否重複,常會用到hashCode()跟equals()
規格書中也建議兩個方法必需要同時實做(來源:JavaSE7技術手冊)
所以在此hashCode我就直接return接收到的變數當作HashCode
如果數字一樣就代表這是個重複的元素不予收集
equals()判斷obj是否為null跟getClass的內容是否一樣
程式本體的部份while只需判斷lotteryNumber的size()是否有小於6就好
原因很簡單,只要小於6就代表Set收集到的obj未滿6個
只要size()的內容等於6就表示這個hashSet的物件裡面的存的物件一定是不重複的
最後當你呼叫toString的時候他就會一一回傳重新定義過的toString內容並印出數字

import java.util.HashSet; import java.util.Random; import java.util.Set; class lottery { private String number; public lottery(String number) { this.number = number; } public boolean equals(Object obj) { if (obj == null) { return false; } if (getClass() != obj.getClass()) { return false; } return true; } public int hashCode() { return Integer.valueOf(number); } public String toString() { return number; } } public class test { public static void main(String[] args) { Random random = new Random(); Set lotteryNumber = new HashSet(); while (lotteryNumber.size() < 6) { lotteryNumber.add(new lottery( Integer.toString(random.nextInt(49) + 1))); } System.out.println(lotteryNumber); } }

1 則留言:

  1. Casino | DrmCD
    Find the 과천 출장마사지 most current reviews, 화성 출장샵 ratings, offers and 당진 출장안마 contact information for Casino at DrmCD. 경상남도 출장안마 Click 광주 출장안마 here for a detailed, detailed

    回覆刪除