我无法理解用于散列的psedorandom数字生成器的编程代码

时间:2016-03-29 14:04:58

标签: java

首先,我刚开始学习Java,我可以说它比C或python更具挑战性。我不太喜欢编程,所以我很难理解一些代码是如何工作的。特别是这个

public class Pseudo
 {
 final int a = 2;
 final int c = 3;
 int address;
 String list[][] = new String [100][6];



public void AddRecord(String ID, String Name, String Course, String Address, String Email, String Contact)
{        
   address = (a * Integer.parseInt(ID) + c) % list.length;

     if((Integer.parseInt(ID)<100000||Integer.parseInt(ID)>999999)||ID.length()==0 || Name.length()==0 || Course.length()==0 || Address.length()==0)
     {
        showMessageDialog(null,"The ID number should be in six digit and the particular field should not be empty","",ERROR_MESSAGE);
     }

    else{

     if(list[address][0]!=null){
        showMessageDialog(null,"Collison is occur, the same address is get. Recalculating...............","",WARNING_MESSAGE);

        while(list[address][0]!=null)
        {                
            address = (a * address + c) % list.length;               
        }
     }

        list[address][0] = ID; 
        list[address][1] = Name; 
        list[address][2] = Course; 
        list[address][3] = Address;
        list[address][4] = Email;
        list[address][5] = Contact;

        showMessageDialog(null,"Student Information " + ID + " will be saved in address: " + address,"",INFORMATION_MESSAGE);

   }
}

时会出现混乱
address = (a * Integer.parseInt(ID) + c) % list.length;

     if((Integer.parseInt(ID)<100000||Integer.parseInt(ID)>999999)||ID.length()==0 || Name.length()==0 || Course.length()==0 || Address.length()==0)

这是什么意思。根据我对此代码的理解,在IF语句中,您可以拥有多于1个条件。我不确定,因为这是我第一次看到这样的代码。

第二个就是这个

   if(list[address][0]!=null){
        showMessageDialog(null,"Collison is occur, the same address is get. Recalculating...............","",WARNING_MESSAGE);

        while(list[address][0]!=null)
        {                
            address = (a * address + c) % list.length;               
        }
     }

        list[address][0] = ID; 
        list[address][1] = Name; 
        list[address][2] = Course; 
        list[address][3] = Address;
        list[address][4] = Email;
        list[address][5] = Contact;

        showMessageDialog(null,"Student Information " + ID + " will be saved in address: " + address,"",INFORMATION_MESSAGE);

如果发生碰撞,应该再次使用psedorandom数字生成器更改存储它的地址,但我无法掌握的是 list [address] [0]!= null。我只是对这一行感到困惑。我知道如果发生碰撞,它的工作就是更改地址,但我不知道这部分执行方式的确切机制。

3 个答案:

答案 0 :(得分:0)

  

根据我对此代码的理解,在IF语句中你可以有超过1个条件。

嗯,是的,不是。您可以根据许多较小的条件构造复杂的条件,但最终必须将整个条件解析为单个布尔值的真/假结果。

在这种情况下考虑条件:

(Integer.parseInt(ID)<100000||Integer.parseInt(ID)>999999)||ID.length()==0 || Name.length()==0 || Course.length()==0 || Address.length()==0

让我们将其分解为其组成部分:

(
    Integer.parseInt(ID)<100000 ||
    Integer.parseInt(ID)>999999
) ||
ID.length()==0 ||
Name.length()==0 ||
Course.length()==0 ||
Address.length()==0

它真的只是把一堆比较链接成一个大的真/假陈述。你基本上可以读到这样的东西:

  

如果(某事)或(别的)或(另一件事)那么......

每个something本身可以包含小something等等。您可以根据需要构建复杂的逻辑条件,将子条件与括号分组,只要整个事情解析为单个真/假结果。

  

我能抓住的是list [address] [0]!= null

这只是检查特定值是否为null。该值是嵌套(锯齿状)数组的一部分。所以你有一个名为list的变量。该变量是一个数组。该数组中的每个元素本身也也是数组。所以你得到一种二维数组(但是一个锯齿状的数组,其中任何给定的子数组都不必与其他子数组的长度相同)。

该特定代码片段在list索引处查看address数组,并查看 子数组的0索引,并检查该值是否为null

答案 1 :(得分:0)

首先,如果格式正确,理解任何代码都会容易得多。所有好的IDE都具有这样的功能,例如对于Eclipse,快捷键是Ctrl + Shift + F,对于IntelliJ IDEA Ctrl + Alt + L。

最重要的部分,可能会解决你的第一个困惑:||是Java中的逻辑OR,表示ID必须是介于100000和999999之间的数字,并且属性不能为空。或者从字面上看,如果ID小于100000或大于999999或任何值为空,则会出现错误消息,并且不会执行任何操作。

对于第二部分:null表示未设置变量,因此为防止覆盖条目,您可以检查它是否已设置,即不等于null。因此,代码会更改address变量,直到找到尚未设置数据的地址,然后使用它来存储给定的数据。

此代码中存在几个潜在问题,其中包括:

  • 对相对较慢的Integer.parseInt(String)的几次调用,在那里可以调用一次并存储到变量中
  • 潜在的NumberFormatException如果ID不是数字(或为空,或者有多余的空格)
  • 如果数组已满,则为无限循环

但是因为它看起来像一些CS家庭作业,所以无关紧要。

答案 2 :(得分:0)

非常感谢大卫先生。我理解第一部分,如果你有一个条件,你可以把它堆叠在一起,从我能理解的它只适用于||(OR)语句,因为使用它将保证真或假结束。

while(list[address][0]!=null)

但我对问题的第二部分仍然有点困惑。因为该行是检查数组是否为null意味着没有正确的值。这是我对情况的理解。如果用户输入相同的ID号,则代码的特定部分假设解决任何冲突,所以不应该是检查导致碰撞的值。但是,只要检测到空值,相似的程序就会被实现,这条线似乎正在进行。