问题一:求一个检测重复号的方法`
问题二:我建了七个类`感觉代码太重复`本想用接口``但是Lottery.jTextField1.setText(String.valueOf(num)); 这句话放到RUN里面才有效果`每个线程里的jTextField名称又不是一样的```
有什么办法能解决这个问题`那样就可以用Runnable接口了``
package less13;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JTextField;import javax.swing.WindowConstants;
import javax.swing.SwingUtilities;
import java.util.*;/**
* This code was edited or generated using CloudGarden's Jigloo
* SWT/Swing GUI Builder, which is free for non-commercial
* use. If Jigloo is being used commercially (ie, by a corporation,
* company or business for any purpose whatever) then you
* should purchase a license for each developer using Jigloo.
* Please visit www.cloudgarden.com for details.
* Use of Jigloo implies acceptance of these licensing terms.
* A COMMERCIAL LICENSE HAS NOT BEEN PURCHASED FOR
* THIS MACHINE, SO JIGLOO OR THIS CODE CANNOT BE USED
* LEGALLY FOR ANY CORPORATE OR COMMERCIAL PURPOSE.
*/
public class Lottery extends javax.swing.JFrame {
static JButton jButton2;
static JTextField jTextField6;
static JTextField jTextField7;
static JTextField jTextField5;
static JTextField jTextField4;
static JTextField jTextField3;
static JTextField jTextField2;
static JTextField jTextField1;
private JButton jButton1; /**
* Auto-generated main method to display this JFrame
*/
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
Lottery inst = new Lottery();
inst.setLocationRelativeTo(null);
inst.setVisible(true);
}
});
}

public Lottery() {
super("双色球摇号系统");
initGUI();
}

private void initGUI() {
try {
setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
getContentPane().setLayout(null);
{
jButton1 = new JButton();
getContentPane().add(jButton1);
jButton1.setText("\u5f00\u59cb\u6447\u53f7");
jButton1.setBounds(36, 170, 86, 36);
jButton1.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
jButton1ActionPerformed(evt);
}
});
}
{
jButton2 = new JButton();
getContentPane().add(jButton2);
jButton2.setText("\u590d\u4f4d");
jButton2.setBounds(228, 171, 103, 35);
jButton2.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
jButton2ActionPerformed(evt);
}
});
}
{
jTextField1 = new JTextField();
getContentPane().add(jTextField1);
jTextField1.setBounds(12, 93, 34, 28);
}
{
jTextField2 = new JTextField();
getContentPane().add(jTextField2);
jTextField2.setBounds(65, 93, 34, 28);
}
{
jTextField3 = new JTextField();
getContentPane().add(jTextField3);
jTextField3.setBounds(116, 93, 34, 28);
}
{
jTextField4 = new JTextField();
getContentPane().add(jTextField4);
jTextField4.setBounds(168, 93, 34, 28);
}
{
jTextField5 = new JTextField();
getContentPane().add(jTextField5);
jTextField5.setBounds(218, 93, 34, 28);
}
{
jTextField6 = new JTextField();
getContentPane().add(jTextField6);
jTextField6.setBounds(275, 93, 34, 28);
}
{
jTextField7 = new JTextField();
getContentPane().add(jTextField7);
jTextField7.setBounds(337, 93, 34, 28);
}
pack();
setSize(400, 300);
} catch (Exception e) {
e.printStackTrace();
}
}
//检查是否有相等号码的方法
public void idEqual()
{

}
//摇号事件
private void jButton1ActionPerformed(ActionEvent evt) {

Number1 n1=new Number1();
Number2 n2=new Number2();
Number3 n3=new Number3();
Number4 n4=new Number4();
Number5 n5=new Number5();
Number6 n6=new Number6();
Number7 n7=new Number7();
n1.start();
n2.start();
n3.start();
n4.start();
n5.start();
n6.start();
n7.start();
}
//复位事件
private void jButton2ActionPerformed(ActionEvent evt) {
jTextField1.setText(String.valueOf(0));
jTextField2.setText(String.valueOf(0));
jTextField3.setText(String.valueOf(0));
jTextField4.setText(String.valueOf(0));
jTextField5.setText(String.valueOf(0));
jTextField6.setText(String.valueOf(0));
jTextField7.setText(String.valueOf(0)); }
}class Number1 extends Thread
{
Random r= new Random();
int num=0;
public void run()
{
for(int i=0;i<100;i++)
{
 num=r.nextInt(33)+1;
 try {
sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();
} Lottery.jTextField1.setText(String.valueOf(num));
}

}
}
class Number2 extends Thread
{
Random r= new Random();
int num=0;
public void run()
{
for(int i=0;i<100;i++)
{
 num=r.nextInt(33)+1;
 try {
sleep(50);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Lottery.jTextField2.setText(String.valueOf(num));

}

}
}
class Number3 extends Thread
{
Random r= new Random();
int num=0;
public void run()
{
for(int i=0;i<100;i++)
{
 num=r.nextInt(33)+1;
 try {
sleep(50);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Lottery.jTextField3.setText(String.valueOf(num));

}

}
}
class Number4 extends Thread
{
Random r= new Random();
int num=0;
public void run()
{
for(int i=0;i<100;i++)
{
 num=r.nextInt(33)+1;
 try {
sleep(50);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Lottery.jTextField4.setText(String.valueOf(num));
}

}
}
class Number5 extends Thread
{
Random r= new Random();
int num=0;
public void run()
{
for(int i=0;i<100;i++)
{
 num=r.nextInt(33)+1;
 try {
sleep(50);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Lottery.jTextField5.setText(String.valueOf(num));

}

}
}
class Number6 extends Thread
{
Random r= new Random();
int num=0;
public void run()
{
for(int i=0;i<100;i++)
{
 num=r.nextInt(33)+1;
 try {
sleep(50);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Lottery.jTextField6.setText(String.valueOf(num));

}

}
}
class Number7 extends Thread
{
Random r= new Random();
int num=0;
public void run()
{
for(int i=0;i<100;i++)
{
 num=r.nextInt(16)+1;
 try {
sleep(50);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Lottery.jTextField7.setText(String.valueOf(num));

}

}
}

解决方案 »

  1.   

    没看你代码,说下思路
    假设36个号码
    建个数组长36,分别初始化值为1-36
    用一个int型变量num来标识当前数组可用的最后一位下标35
     
    从0-num随机取值,取到后,将此下标的数组与下标为num的值交换位置 
    num--;再0-num随机取一个值,取后,再和下标为num的值交换位置
    num--;
    ……
    循环直到取满,所要的个数
      

  2.   

    摇出的号从集合里删除掉。你的NumberX几个类没必要这么写。这么写和java思想不相符啊!
      

  3.   

    把1楼的思想代码化int[] num = new int[20];
    for(int i = 0; i < num.length; i++)
    {
       num[i] = (int)(Math.random()*100);
    }
    int[] newNum = new int[20];
    int length = num.length;
    for(int j = 0; j < newNum.length; j++)
    {
       int index = (int)(Math.random()*length);//随机产生下标
       newNum[j] = num[index];
       num[index] = num[length-1];
       length--;
    }
    //newNum就是不重复的随机抽取数,纯手写,没测试过,可能有误- -!
      

  4.   


    这样吧,加入你要做个模拟双色球的例子,从33个球里面选6个出来,保证不重复.        private static Random random = new Random();
    public static int[] red = new int[33];
    private static int temp; static {
    for (int i = 0; i < 33; i++) {
    red[i] = i + 1;
    }
    }
            //随机取一个已有的数字,将它和第一个元素交换,你重复个若干次,然后直接取前6个元素就可以了
            //这个你可以做随机发牌程序也可以
    public static String getRedNumbers() {
    for (int i = 200; i > 0; i--) {
    int n = random.nextInt(33);
    temp = red[0];
    red[0] = red[n];
    red[n] = temp;
    }
    return red[0] + " " + red[1] + " " + red[2] + " " + red[3] + " "
    + red[4] + " " + red[5] + " ";
    }
      

  5.   

    粗略看了一下你的代码,觉得程序结构比较乱,简单问题被复杂化了。最不好的地方就是在几个数字的类里调用Lottery这个类,Lottery类里还用了静态的JTextField,实在是编程的大忌。不知道你是否有什么特殊的要求,但对于我来说,这个程序无非就是生成7个1-33的不重复随机数而已。用简单代码描述一下我的思路吧
    import java.util.HashSet;
    import java.util.Set;public class Lottery { private Set<Integer> set = new HashSet<Integer>();

    public int generateNum(int range) {
    int num = (int)(Math.random() * (range)) + 1;

    if(set.contains(num)) {
    System.out.println("\n---duplication " + num + "!!! re-generate---\n");
    return generateNum(range);
    } else {
    set.add(num);
    }
    return num;
    }

    public void getAllNumbers() {
    for(int i = 0; i < 7; i ++) {
    System.out.print("\nLottery Num: " + generateNum(33));
    }
    }

    /*** test ***/
    public static void main(String args[]) {

    Lottery l = new Lottery();

    l.getAllNumbers();
    }
    }
      

  6.   

    很困难么?
    do{
    for(int i=0;i<6;i++){
    a[i]=(int) (Math.random()*35+1);
    }
    c=0;
    Arrays.sort(a);

    for(int i=1;i<6;i++){
        if(a[i]==a[i-1]){
         c=1;
        }
    }
       }while(c==1);
      

  7.   


     do
                {
                    for (int i = 0; i < 6; i++)
                    {
                        a[i] = seed.Next(1, 36);
                        b += a[i] + c;
                    }                d = 0;                 for (int j = 0; j < 5; j++)
                    {
                        for (int k = j+1; k < 6; k++)
                        {
                            if (a[j] == a[k])
                            {
                                d = 1;
                                b = "";
                                break;  
                            }
                        }
                    }
                } while (d == 1);
      

  8.   

    用集合就可以完成了,例如ArrayList,用一个循环就能完成重复的代码,这才符合Java的思想。