比较哈希表java中存储的对

比较哈希表java中存储的对,java,hashtable,compare,Java,Hashtable,Compare,首先,我有一个2d数组来存储许多数字,然后我使用一个hushtables数组来存储由2d数组中每一行的数字组成的对。 例如,在2d数组的第一行中,数字为1 2 3 4 5 那么这些对应该是1,21,31,4,1,5等。 生成对并存储在哈希表中的代码如下 Hashtable [] table=new Hashtable [lineCounter]; int [] pairCounter=new int[lineCounter]; for(int i=0;i<line

首先,我有一个2d数组来存储许多数字,然后我使用一个hushtables数组来存储由2d数组中每一行的数字组成的对。 例如,在2d数组的第一行中,数字为1 2 3 4 5 那么这些对应该是1,21,31,4,1,5等。 生成对并存储在哈希表中的代码如下

     Hashtable [] table=new Hashtable [lineCounter];
    int [] pairCounter=new int[lineCounter];
    for(int i=0;i<lineCounter;i++)
  {
     table[i]=new Hashtable();
     for (int j=0;j<lineitem2[i]-1;j++)
     {
         for(int t=j+1;t<lineitem2[i];t++)
         {
             int firstnum=freItem[i][j];
             int secnum=freItem[i][t];
             String value=firstnum+":"+secnum;
             //System.out.println(firstnum+"``"+secnum);
             table[i].put(pairCounter[i],value);
             pairCounter[i]++;
             //System.out.println(i+":::"+table[i].get(firstnum));
         }
     }
 }
Hashtable[]table=新的Hashtable[lineCounter];
int[]pairCounter=新的int[行计数器];

对于(int i=0;i如果您的代码在较小的数据集上工作,可能只是JVM使用的默认64Mb不够,当您将
-Xmx512m
作为参数传递到Java命令行时,它是否工作?

如果您的代码在较小的数据集上工作,可能只是JVM使用的默认64Mb不够,它是否工作是否将
-Xmx512m
作为参数传递给Java命令行?

好的,假设您有一个
类,如下所示:

public class Pair {

    private final int value1;
    private final int value2;

    public Pair(int value1, int value2) {
        this.value1 = value1;
        this.value2 = value2;
    }

    public int value1() {
        return value1;
    }

    public int value2() {
        return value2;
    }

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + value1;
        result = prime * result + value2;
        return result;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Pair other = (Pair) obj;
        if (value1 != other.value1)
            return false;
        if (value2 != other.value2)
            return false;
        return true;
    }

    @Override
    public String toString() {
        return "(" + value1 + ", " + value2 + ")";
    }

}
请注意,如果希望在基于哈希的数据结构(例如:,)中使用
类的实例时表现正常,则正确实现和方法非常重要

现在,此代码将在文件中读取(需要):

文件=。。。;
最终映射lineNumbersByPair=newhashmap();
/*
*第一步:逐行阅读。
*/
Reader Reader=新文件读取器(文件);
试一试{
BufferedReader BufferedReader=新的BufferedReader(读卡器);
试一试{
弦线;
int lineNumber=0;
而((line=bufferedReader.readLine())!=null){
lineNumber++;
字符串[]标记=line.split(\\s+);
int[]值=新的int[tokens.length];
for(int i=0;i1){
System.out.println(pair+”出现在以下行:“+行号”;
}
}

在测试中,代码在一个有20000行的文件中读取,每行包含10个介于0和1000之间的数字。

好的,假设您有一个
类,如下所示:

public class Pair {

    private final int value1;
    private final int value2;

    public Pair(int value1, int value2) {
        this.value1 = value1;
        this.value2 = value2;
    }

    public int value1() {
        return value1;
    }

    public int value2() {
        return value2;
    }

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + value1;
        result = prime * result + value2;
        return result;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Pair other = (Pair) obj;
        if (value1 != other.value1)
            return false;
        if (value2 != other.value2)
            return false;
        return true;
    }

    @Override
    public String toString() {
        return "(" + value1 + ", " + value2 + ")";
    }

}
请注意,如果希望在基于哈希的数据结构(例如:,)中使用
类的实例时表现正常,则正确实现和方法非常重要

现在,此代码将在文件中读取(需要):

文件=。。。;
最终映射lineNumbersByPair=newhashmap();
/*
*第一步:逐行阅读。
*/
Reader Reader=新文件读取器(文件);
试一试{
BufferedReader BufferedReader=新的BufferedReader(读卡器);
试一试{
弦线;
int lineNumber=0;
而((line=bufferedReader.readLine())!=null){
lineNumber++;
字符串[]标记=line.split(\\s+);
int[]值=新的int[tokens.length];
for(int i=0;i    File file = ...;

    final Map<Pair, Collection<Integer>> lineNumbersByPair = new HashMap<Pair, Collection<Integer>>();

    /*
     * Step 1: Read in the lines, one by one.
     */
    Reader reader = new FileReader(file);
    try {
        BufferedReader bufferedReader = new BufferedReader(reader);
        try {
            String line;

            int lineNumber = 0;
            while ((line = bufferedReader.readLine()) != null) {
                lineNumber++;

                String[] tokens = line.split("\\s+");
                int[] values = new int[tokens.length];

                for (int i = 0; i < tokens.length; i++) {
                    values[i] = Integer.parseInt(tokens[i]);
                }

                for (int i = 0; i < values.length; i++) {
                    for (int j = i + 1; j < values.length; j++) {
                        Pair pair = new Pair(values[i], values[j]);

                        Collection<Integer> lineNumbers;
                        if (lineNumbersByPair.containsKey(pair)) {
                            lineNumbers = lineNumbersByPair.get(pair);
                        } else {
                            lineNumbers = new HashSet<Integer>();
                            lineNumbersByPair.put(pair, lineNumbers);
                        }
                        lineNumbers.add(lineNumber);
                    }
                }
            }
        } finally {
            bufferedReader.close();
        }
    } finally {
        reader.close();
    }

    /*
     * Step 2: Identify the unique pairs. Sort them according to how many lines they appear on (most number of lines to least number of lines).
     */
    List<Pair> pairs = new ArrayList<Pair>(lineNumbersByPair.keySet());
    Collections.sort(
            pairs,
            new Comparator<Pair>() {
                @Override
                public int compare(Pair pair1, Pair pair2) {
                    Integer count1 = lineNumbersByPair.get(pair1).size();
                    Integer count2 = lineNumbersByPair.get(pair2).size();
                    return count1.compareTo(count2);
                }
            }
        );
    Collections.reverse(pairs);

    /*
     * Step 3: Print the pairs and their line numbers.
     */
    for (Pair pair : pairs) {
        Collection<Integer> lineNumbers = lineNumbersByPair.get(pair);
        if (lineNumbers.size() > 1) {
            System.out.println(pair + " appears on the following lines: " + lineNumbers);
        }
    }