在Java中使用哈希值排序数组

在Java中使用哈希值排序数组,java,arrays,sorting,hash,disk,Java,Arrays,Sorting,Hash,Disk,我从一个文件中读取数据,从文件中取出每一行,然后将它们插入数组中。我需要将这些字符串转换成字节,并将它们写入基于磁盘的哈希文件 我要做的是获取具有相同哈希值的每个字符串,并将它们写入磁盘上的同一扇区。到目前为止,我所做的是根据它们的散列值对它们进行排序,这在数组的末尾效果不是很好,因为有1000个元素,我的函数返回的最大散列值是249 线性探测导致许多字符串不合适,因此使用此数组写入扇区将无法正常工作。我该怎么做 这是我的代码,如果我不清楚的话,我到目前为止做了什么: private void

我从一个文件中读取数据,从文件中取出每一行,然后将它们插入数组中。我需要将这些字符串转换成字节,并将它们写入基于磁盘的哈希文件

我要做的是获取具有相同哈希值的每个字符串,并将它们写入磁盘上的同一扇区。到目前为止,我所做的是根据它们的散列值对它们进行排序,这在数组的末尾效果不是很好,因为有1000个元素,我的函数返回的最大散列值是249

线性探测导致许多字符串不合适,因此使用此数组写入扇区将无法正常工作。我该怎么做

这是我的代码,如果我不清楚的话,我到目前为止做了什么:

private void importFile(String dataFile) {
  String line = null;
  theDisk.clearDisk();

  try {
    BufferedReader bufferedReader = new BufferedReader(new FileReader(dataFile));

    // List to hold the lines 
    List<String> list = new ArrayList<>();

    while((line = bufferedReader.readLine()) != null){
      list.add(line);
    }

    String[] strArray = list.toArray(new String[0]);
    String[] orderedArray = new String[strArray.length];

    for(int i = 0; i < strArray.length; i++) {
      String current = strArray[i];
      // Use email as key
      String key = current.substring(0,current.indexOf(','));
      int index = hashFunc3(key);

      if(orderedArray[index] == null) {
        orderedArray[index] = current;
      } else {
        while(orderedArray[index] != null) {
          index = index+1;
        }
        orderedArray[index] = current;
      }
    }

    // Always close files.
    bufferedReader.close();     
  }

  catch(FileNotFoundException ex) {
    System.out.println("Unable to open file '" + dataFile + "'");
  }

  catch(IOException ex) {
    System.out.println("Error reading file '" + dataFile + "'");
  }
}
private void导入文件(字符串数据文件){
字符串行=null;
clearDisk();
试一试{
BufferedReader BufferedReader=新的BufferedReader(新文件读取器(数据文件));
//列出要保留的行
列表=新的ArrayList();
而((line=bufferedReader.readLine())!=null){
列表。添加(行);
}
String[]strArray=list.toArray(新字符串[0]);
String[]orderedArray=新字符串[strArray.length];
对于(int i=0;i
只需使用您自己的比较器对列表进行排序:

Collections.sort(list, new Comparator<String>(){
    @Override
    public int compare(String o1, String o2) {
      return Integer.compare(o1.hashCode(), o2.hashCode());
      //or use your own hashcode functions here
    }
}); //now list is sorted by hashcode
String[] orderedArray = list.toArray(new String[0]);
Collections.sort(列表,新比较器(){
@凌驾
公共整数比较(字符串o1、字符串o2){
返回整数.compare(o1.hashCode(),o2.hashCode());
//或者在这里使用您自己的hashcode函数
}
}); //现在列表按哈希代码排序
String[]orderedArray=list.toArray(新字符串[0]);

只需使用您自己的比较器对列表进行排序:

Collections.sort(list, new Comparator<String>(){
    @Override
    public int compare(String o1, String o2) {
      return Integer.compare(o1.hashCode(), o2.hashCode());
      //or use your own hashcode functions here
    }
}); //now list is sorted by hashcode
String[] orderedArray = list.toArray(new String[0]);
Collections.sort(列表,新比较器(){
@凌驾
公共整数比较(字符串o1、字符串o2){
返回整数.compare(o1.hashCode(),o2.hashCode());
//或者在这里使用您自己的hashcode函数
}
}); //现在列表按哈希代码排序
String[]orderedArray=list.toArray(新字符串[0]);

我建议使用
ArrayList
ArrayList
而不是数组。这将允许您将具有相同哈希的行放入相同的内部
ArrayList
。在外部
ArrayList
中使用哈希作为索引,以查找正确的内部列表。对于初始化,用空的
ArrayList
s填充外部列表(以避免在填充内部列表时出现IndexOutOfBoundsException或NPE)

现在你可以做:

        // to write the lines to disk you may for instance do something like this:
        for (List<String> bucket : orderedList) {
            for (String currentLine : bucket) {
                // write currentLine to file
            }
        }
//例如,要将行写入磁盘,您可以执行以下操作:
对于(列表存储桶:orderedList){
用于(字符串currentLine:bucket){
//将currentLine写入文件
}
}

我们可能会使用ArrayList的数组,但数组和集合的混合并不总是很好。

我建议使用
ArrayList的
ArrayList
而不是数组。这将允许您将具有相同哈希的行放入相同的内部
ArrayList
。在外部
ArrayList
中使用哈希作为索引,以查找正确的内部列表。对于初始化,用空的
ArrayList
s填充外部列表(以避免在填充内部列表时出现IndexOutOfBoundsException或NPE)

现在你可以做:

        // to write the lines to disk you may for instance do something like this:
        for (List<String> bucket : orderedList) {
            for (String currentLine : bucket) {
                // write currentLine to file
            }
        }
//例如,要将行写入磁盘,您可以执行以下操作:
对于(列表存储桶:orderedList){
用于(字符串currentLine:bucket){
//将currentLine写入文件
}
}

我们可能使用了ArrayList数组,但数组和集合的混合并不总是很好。

如果哈希函数只返回249个不同的值,但您有更多不同的输入字符串,那么您希望如何对具有相同值的输入字符串进行排序?@PhilippReichart,我甚至都不会点。我会找到每个具有相同值的字符串,然后将它们写入相应的扇区,然后转到下一个值。4个值为0的字符串进入扇区0,依此类推。但除了先对阵列排序,然后根据值最终拆分阵列之外,我还没有想到一种方法来实现这一点。您对磁盘扇区的理解和我一样吗?为什么要控制每条线写入哪个扇区?我不知道从java中做这个的方法,你可能想考虑另一种方式来代替java。将这些部门视为桶。我需要将每个具有相同哈希值的记录写入同一个bucket。我知道如何在我的假磁盘驱动器上写入这些存储桶,我只是很难将每个具有相同值的记录收集到某个存储桶的数组中。如果您的哈希函数只返回249个不同值,但您的不同输入字符串比这多,那么,您希望如何对具有相同值的输入字符串进行排序?@PhilippReichart理想情况下,我甚至不会对它们进行排序。我会找到每个具有相同值的字符串,然后将它们写入相应的扇区,然后转到下一个值。4个值为0的字符串进入扇区0,依此类推。但除了先对数组排序,然后根据值最终拆分数组之外,我还没有想到一种方法来实现这一点