java 二维数组实操

java 二维数组实操

一、灵感来源

这个文章主要是在看了一个十分厉害的大佬的有关双色球的一篇文章之后,有感而发,写出的一个小小的代码。

这个代码主要是针对双色球的随机生成,统计数字出现频率,并整合出一个双色球号码,让随机生成的双色球数字与这个号码的数字的重合率越低越好。

PS:我这里指的双色球是1~32里面选5个,1~16里面选两个。(别问为啥)

二、代码

2.1 双色球生成代码(没有抄)

import java.util.*;
 
public class lotterySimulator
{
   public static int[][] generator(int a, int b)
   {
      int[][] arr = new int[a][b];
      Random random = new Random();
      int c = 0;
      for(int i = 0 ; i < arr.length ; i++)
      {
         for(int j = 0; j < arr[i].length ; j++)
         {           
            while(true)
            {
               c = j == 5 || j == 6 ? random.nextInt(15)+1 : random.nextInt(31)+1;
               if(!contains(c,arr[i]))
               {
                  break;
               }
            } 
            arr[i][j] = c;       
         }
      }
      return arr;
   }
   public static boolean contains(int a, int[] sss)
   {
      boolean result = false;
      for(int er : sss)
      {
         result = er == a ? true : false;
         if(result == true)
         {
            break;
         }
      }
      return result;
   }
   public static void main(String[] args)
   {
      int[][] arra = generator(10,7);
      for(int[] a : arra)
      {
         for(int b : a)
         {
            System.out.print(b+",");
         }
         System.out.println("");
      }
   }
}

2.2 选择排序

毕竟最后做出来的那个号码还是需要验证一下,所以需要一个选择排序来整理一下自动生成的号码,乱糟糟的毕竟不容易检查。

注:这里的代码不是常规的选择排序,请不要直接拿去用,会出问题。

private static int[] selectionSort(int[] arr)
   {
      for (int i = 0; i <arr.length - 3; i++) 
      {
          int index = i;
          for (int j = i + 1; j<arr.length-2; j++) 
          {
              if (arr[j] < arr[index]) 
              {
                  index = j;
              }
          }
          int tmp = arr[index];
          arr[index] = arr[i];
          arr[i] = tmp;
      }
      if(arr[arr.length-2]>arr[arr.length-1])
      {
         int temp = 0;
         temp = arr[arr.length-1];
         arr[arr.length-1] = arr[arr.length-2];
         arr[arr.length-2] = temp;
      }
      return arr;
   }

这里因为最后两个数只需要if比较就好了,不用再多加一个for-for嵌套来遍历。要注意的是第一个for循环的循环次数需要减少,内外for的次数都需要减少2。

PS:这是正常的选择排序

2.3 遍历判断

因为最后需要的是重合率最低的一个号码,所以我们需要将自动生成的二维数组的每个数据进行统计,然后根据出现的次数,选择组成号码的数字。(这个不一定是最好的方法,但一定是在你不想思考的时候可以用的最简单的。

统计的方法,就是用两个二维数组(因为有1~32 和1~16的),这个二维数组是【2】【32】和【2】【16】。就是一个一维数组用来装1~32和1~16这些数字,一个用来装他们出现的次数。

for(int i = 0; i < store32[0].length; i++)
      {
         store32[0][i] = i+1;
      }
      for(int i = 0; i < store16[0].length; i++)
      {
         store16[0][i] = i+1;
      }
      for(int i = 0; i < arra.length; i++)
      {
         for(int j = 0; j < 5; j++)
         {
            for(int k = 0; k < store32[0].length; k++)
            {
               if(arra[i][j] == store32[0][k])
               {
                  store32[1][k] += 1;
               }
            }
         }
      }
      for(int i = 0; i < arra.length; i++)
      {
         for(int j = 5; j < 7; j++)
         {
            for(int k = 0; k < store16[0].length; k++)
            {
               if(arra[i][j] == store16[0][k])
               {
                  store16[1][k] += 1;
               }
            }
         }
      }

 格式有亿点怪,不过不要紧。这里必须用三重for嵌套,因为它是在同时对于三个数据进行遍历。一个是arra这个二维数组所含有的所有一维数组,一个是arra里面的一维数组里面的数据,一个是装了1~32和1~16的数组的数据。一定要用三重,不然会出问题。理论上说,这段代码是可以缩短的,但是我懒,简化的事情就交给你们了。

2.4 筛选最少出现数字

这个筛选的方法有很多,比如说借用选择排序利用索引的方法,选最小然后判断。。。。。。

方法很多,这里我就说一下我的方法。

我的方法主要是while-for嵌套。利用while可以不限制循环次数的特点,配合for的索引,从0开始,将出现次数为0的数字写进一个一维数组,然后+=1,不断遍历。最后for和while都来一个break,就可以了。

while(true)
      {
         for(int i = 0; i < store32[0].length; i++)
         {
            if(store32[1][i] == a)
            {
               output[b] = store32[0][i];
               b += 1;
            }
            if(b == 5)
         {
            break;  
         }
         }
         a += 1;
         if(b == 5)
         {
            break;  
         }
      }
      a = 0;
      b = 5;
      while(true)
      {
         for(int i = 0; i < store16[0].length; i++)
         {
            if(store16[1][i] == a && !contains(store16[0][i],output))
            {
               output[b] = store16[0][i];
               b += 1;
            }
            if(b == 7)
            {
               break;  
            }
         }
         a += 1;
         if(b == 7)
         {
            break;  
         }
      }

三、总代码 

import java.util.*;

public class lotterySimulator
{
   public static int[][] generator(int a, int b)
   {
      int[][] arr = new int[a][b];
      Random random = new Random();
      int c = 0;
      for(int i = 0 ; i < arr.length ; i++)
      {
         for(int j = 0; j < arr[i].length ; j++)
         {           
            while(true)
            {
               c = j == 5 || j == 6 ? random.nextInt(15)+1 : random.nextInt(31)+1;
               if(!contains(c,arr[i]))
               {
                  break;
               }
            } 
            arr[i][j] = c;       
         }
      }
      return arr;
   }
   public static boolean contains(int a, int[] sss)
   {
      boolean result = false;
      for(int er : sss)
      {
         result = er == a ? true : false;
         if(result == true)
         {
            break;
         }
      }
      return result;
   }
   public static void main(String[] args)
   {
      int[][] arra = generator(10,7);
      int[][] store32 = new int[2][32];
      int[][] store16 = new int[2][16];
      int[] output = new int[7];     
      for(int i = 0; i < arra.length; i++)
      {
         selectionSort(arra[i]);
      }
      for(int[] a : arra)
      {
         for(int b : a)
         {
            System.out.print(b+ (b == a[a.length-1] ? "\n" : ","));
         }
      }
      for(int i = 0; i < store32[0].length; i++)
      {
         store32[0][i] = i+1;
      }
      for(int i = 0; i < store16[0].length; i++)
      {
         store16[0][i] = i+1;
      }
      for(int i = 0; i < arra.length; i++)
      {
         for(int j = 0; j < 5; j++)
         {
            for(int k = 0; k < store32[0].length; k++)
            {
               if(arra[i][j] == store32[0][k])
               {
                  store32[1][k] += 1;
               }
            }
         }
      }
      for(int i = 0; i < arra.length; i++)
      {
         for(int j = 5; j < 7; j++)
         {
            for(int k = 0; k < store16[0].length; k++)
            {
               if(arra[i][j] == store16[0][k])
               {
                  store16[1][k] += 1;
               }
            }
         }
      }
      int a = 0;
      int b = 0;
      while(true)
      {
         for(int i = 0; i < store32[0].length; i++)
         {
            if(store32[1][i] == a)
            {
               output[b] = store32[0][i];
               b += 1;
            }
            if(b == 5)
         {
            break;  
         }
         }
         a += 1;
         if(b == 5)
         {
            break;  
         }
      }
      a = 0;
      b = 5;
      while(true)
      {
         for(int i = 0; i < store16[0].length; i++)
         {
            if(store16[1][i] == a && !contains(store16[0][i],output))
            {
               output[b] = store16[0][i];
               b += 1;
            }
            if(b == 7)
            {
               break;  
            }
         }
         a += 1;
         if(b == 7)
         {
            break;  
         }
      }
  
      for(int x : output)
      {
         System.out.print(x == output[output.length-1] ? x : x + ",");
      } 
   }
   private static int[] selectionSort(int[] arr)
   {
      for (int i = 0; i <arr.length - 3; i++) 
      {
          int index = i;
          for (int j = i + 1; j<arr.length-2; j++) 
          {
              if (arr[j] < arr[index]) 
              {
                  index = j;
              }
          }
          int tmp = arr[index];
          arr[index] = arr[i];
          arr[i] = tmp;
      }
      if(arr[arr.length-2]>arr[arr.length-1])
      {
         int temp = 0;
         temp = arr[arr.length-1];
         arr[arr.length-1] = arr[arr.length-2];
         arr[arr.length-2] = temp;
      }
      return arr;
   }
}

就是多了一些初始化和一些输入的代码,用来检查一下程序错没错。

3.1 效果

自动生成:

6,11,15,21,22,1,14
10,22,25,28,29,4,14
5,9,16,24,29,1,11
3,4,15,21,23,6,10
7,12,15,24,27,5,10
1,2,6,14,26,8,13
5,6,10,24,31,4,8
6,14,17,18,26,1,8
3,7,12,23,29,1,10
10,15,19,21,29,3,4


结果:8,13,20,30,32,2,7

自动生成:

5,10,15,19,28,4,14
3,5,12,16,25,8,9
10,21,24,26,27,8,12
1,5,12,21,30,3,15
3,6,14,19,31,4,11
3,9,18,24,26,4,15
9,24,27,28,30,7,10
2,17,18,26,30,10,12
3,11,21,27,28,8,12
3,9,10,27,30,14,15

结果:4,7,8,13,20,1,2

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

A Python 萌新花花

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值