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