public abstract int insertWinLottoNum();
매 로또회차마다 당첨번호를 생성하고 db(lotto)에 저장하고 저장결과 반환
public abstract LottoVO selectCurrentLotto();
최근 회차의 로또정보 반환하기
public abstract ArrayList<ArrayList< Integer >> selectAllLotto();
모든 복권 당첨번호 반환하기
Set<Integer> winLotto=new TreeSet<Integer>();
StringBuffer buffer=new StringBuffer();
while(winLotto.size()<6) {
int random=(int)(Math.random()*45)+1; //1~45 중 하나
winLotto.add(random);
}
Iterator<Integer> itr=winLotto.iterator(); //오름차순 정렬
while(itr.hasNext()) {
int temp=itr.next();
buffer.append(String.valueOf(temp));
if(itr.hasNext()==true) {
buffer.append(",");
}
}
문자열로 넣은 복권번호를 다시 가져올땐 split으로 뽑고 숫자로 변환
String[] win=num.split(",");
int[] winResult=new int[6];
for(int i=0;i<win.length;i++) {
winResult[i]=Integer.parseInt(win[i]);
}
당첨번호와 같은 번호의 개수 조회하는 방법
if(num1[i]==num2[j])count++- 당첨번호 set과 선택번호 set으로 교집합
ArrayList<ArrayList<Integer>> list=new ArrayList<ArrayList<Integer>>();
모든 당첨번호를 db에서 가져오려고하는데 당첨번호는 6개의 숫자가 하나의 데이터이기 때문에 당첨번호를 담는 변수를 arrayList안에 arrayList형태로 했습니다. 처음에는 arrayList안에 int[6]배열을 넣었는데 그것보다는 list안에 list형태가 더 일반적이라고 배워 수정했음.
while(rs.next()) {
String num=rs.getString(COL_LOTTO_NUM); // 0,0,0,0,0,0 형태의 문자열
String[] win=num.split(","); //1회 당 당첨번호
ArrayList<Integer> winResult=new ArrayList<Integer>();
for(int i=0;i<win.length;i++) {
winResult.add(Integer.parseInt(win[i]));
}
list.add(winResult);
}
1~45의 숫자의 당첨정도를 프로그래스바로 비율을 보여주고싶었는데 하나씩 만들다가 이건 아닌것같아서 x,y좌표를 계산해서 배열로 프로그래스바를 생성해주었어요
총 3줄로 한줄엔 15개씩 45개의 숫자를 표시하기
int labelX=7;
int barX=27;
int labelY=150;
int barY=150;
for(int i=0;i<lblNum.length;i++) {
if(i%15==0&&i!=0) {
labelX+=160;
barX+=160;
labelY=150;
barY=150;
}
lblNum[i]=new JLabel((i+1)+"");
lblNum[i].setBounds(labelX, labelY, 15, 15);
lblNum[i].setHorizontalAlignment(SwingConstants.CENTER);
add(lblNum[i]);
labelY+=23;
progressBar[i]=new JProgressBar(0, 50); //max값 50.
progressBar[i].setBounds(barX, barY, 121, 15);
progressBar[i].setStringPainted(true);
progressBar[i].setValue(count[i]);
add(progressBar[i]);
barY+=23;
}
가장 애먹었던 부분은 45개의 숫자 중 가장 많이 나온 6개의 번호를 보여주는 기능이었음
먼저 각 숫자의 당첨횟수를 카운트해주었어요
private int[] getLottoCount() {
//lotto_number 숫자를 받아서 count 배열을 count++해서 저장하기
int[] count=new int[45];
ArrayList<ArrayList<Integer>> list=ldao.selectAllLotto();
if(list.size()!=0) {
for(int i=0; i<list.size();i++) {
for(int j=0;j<list.get(i).size();j++) {
int temp=list.get(i).get(j);
count[temp-1]++;
}
}
}else {
txtAreaLog.setText(">>당첨된 복권 결과가 없습니다.");
return null;
}
return count;
}
그리고 이제 각 번호들의 당첨횟수로 당첨횟수로 내림차순 정렬을 하면 상위 6개의 번호만 뽑아내기로 했다!
숫자따로 횟수따로 변수를 사용하는 방법도 있었지만 나는 count 배열의 인덱스가 번호고 값을 횟수로 저장해봤음. 문제는 count 배열만으로 당첨 횟수로 정렬을 하려고하니 count의 인덱스도 바뀐다는 점.. 나는 count의 인덱스도 그대로 가져가야했다.
그래서 나는 key-value를 가진 map을 사용하기로 했다.
Map<Integer, Integer> map=new HashMap<Integer, Integer>();
for(int i=0;i<count.length;i++) {
map.put(i+1, count[i]);
}
map이 무엇인지만 알지 어떻게 사용해야하는진 잘 몰라서 검색해서 잠깐 공부해봤어요
맵의 key값들을 가지고있음
for(int key : map.keySet(){
system.out.println(key+","+map.get(key));
}
키값을 이용해 value를 가져올 수 있음.
map의 key와 value를 모두 가져올 수 있는 메소드. map.entrySet()으로 읽어온 전체 데이터는 map.Entry라는 컬렉션 객체로 받아서 사용할 수 있음.
getKey()메소드와 getValue() 메소드가 존재함
나는 정렬을 사용하기 위해서 ArrayList를 map.Entry 타입으로 만들어주었다.
List<Entry<Integer, Integer>> entryList= new ArrayList<Map.Entry<Integer,Integer>>(map.entrySet());
그리고 내림차순으로 정렬해 가장 많이 당첨된 상위 6개의 숫자만 사용할것이다.
list의 정렬메소드인sort()를 사용할건데 그냥 Wrapper 타입이 아니라 Entry<Integer, Integer>의 타입을 가진 list라 흔히 사용하는 list.sort(Comparator.reverseOrder()) 는 사용할 수 없었음...
그래서 새로운 compare메소드를 정의해서 사용할 것이다.
Collections.sort(entryList, new Comparator<Entry<Integer, Integer>>() {
public int compare(Entry<Integer, Integer> obj1, Entry<Integer, Integer>obj2) {
return obj2.getValue().compareTo(obj1.getValue());
}
});
map의 value값으로 compareTo()를 사용하면 0bj2의 vlaue가 obj1의 value보다 크면 양수, 작으면 음수, 같으면 0을 반환해서 반환값에 따라 내림차순으로 sort됩니다.
싱글톤 객체는 각 dao마다 만들어줘야해요 그래야 같은 데이터를 가진 db에 접근가능! 다만 db드라이버 등록은 가장먼저 사용되는 MemberDAO 생성자에서 한번만 등록해주면 됩니다. 그외 db연결은 각 메소드마다 해야하구요