Java 如何处理列表<;元组>;
晚上好 我使用反向索引来存储包含这个单词的文件名的单词 使用HashMap:Java 如何处理列表<;元组>;,java,list,Java,List,晚上好 我使用反向索引来存储包含这个单词的文件名的单词 使用HashMap:Map 例: 现在我想做位置索引,将单词存储为键,这一次不仅存储文件名,还存储文件名和单词在文件中出现的时间和位置 <fname,freq,postion1,position2,position3> java在doc1中出现3次,位置为4 8 30 所以我在谷歌上搜索如何做这样的事情 我发现了关于Tuple类,所以我的hashMap就像 public Map <String,List<Tupl
Map
例:
现在我想做位置索引,将单词存储为键
,这一次不仅存储文件名,还存储文件名和单词在文件中出现的时间和位置
<fname,freq,postion1,position2,position3>
java在doc1中出现3次,位置为4 8 30
所以我在谷歌上搜索如何做这样的事情
我发现了关于Tuple类
,所以我的hashMap
就像
public Map <String,List<Tuple>> positionIn=new HashMap<>();
我的问题是:
例如,如何处理这个元组列表
列表中的contains方法是否正确
list.contains(fname)
或list.contains(position)
如何单独获取其元素 根据评论中的要求,我添加以下内容作为回答:
您希望能够通过以下方式区分元组:
- 文件名
- 引用(因为不同的引用表示文件中的不同单词)
list1.containsAll(list2)
和&list2.containsAll(list1)
完成对于
list.contains(x)
您需要x
作为Tuple
的实例,因为list
属于list
类型因此,为了确定您的列表是否包含“/my/path/myFile.txt”,您需要
list.contains(新元组(“/my/path/myFile.txt”,0,null))
,正如注释中所要求的那样,我将此添加为答案:您希望能够通过以下方式区分元组:
- 文件名
- 引用(因为不同的引用表示文件中的不同单词)
list1.containsAll(list2)
和&list2.containsAll(list1)
完成对于
list.contains(x)
您需要x
作为Tuple
的实例,因为list
属于list
类型因此,为了确定您的列表是否包含“/my/path/myFile.txt”,您需要
list.contains(新元组(“/my/path/myFile.txt”,0,null))
使用具有重写的.equals()
方法的对象。我不认为这是元组的预期用途。根本不知道为什么要重写equals
类,也不知道为什么要调用这个类Tuple
,因为它是专门为您使用的自定义类。也不确定为什么要保持频率-它等于位置
列表的大小。@Real怀疑论者是的,你是对的,你是什么意思,我不需要相等?覆盖相等意味着两个实例相等。当有其他字段(如位置)不在equals计算中时,这样做是危险的。你应该总是用它覆盖hashCode。在您的例子中,如果单词“foo”和单词“bar”在同一个文件中,那么它们将有两个具有相同文件名但实际上并不相等的“Tuple”实例。不应该这样做。当我这样做时,我使用了TreeSet
而不是列表。IIRC因为TreeSet
允许我指定要使用的比较器,所以我不必将equals()
行为烘焙到类中。请使用具有重写的.equals()
方法的对象。我不认为这是元组的预期用途。根本不知道为什么要重写equals
类,也不知道为什么要调用这个类Tuple
,因为它是专门为您使用的自定义类。也不确定为什么要保持频率-它等于位置
列表的大小。@Real怀疑论者是的,你是对的,你是什么意思,我不需要相等?覆盖相等意味着两个实例相等。当有其他字段(如位置)不在equals计算中时,这样做是危险的。你应该总是用它覆盖hashCode。在您的例子中,如果单词“foo”和单词“bar”在同一个文件中,那么它们将有两个具有相同文件名但实际上并不相等的“Tuple”实例。不应该这样做。当我这样做时,我使用了TreeSet
而不是列表。IIRC因为TreeSet
允许我指定要使用的比较器,所以我不必将equals()
行为烘焙到类中。
java : doc1,3,4,8,30
public Map <String,List<Tuple>> positionIn=new HashMap<>();
public class Tuple {
private String filepath;
private int wordfreq;
private List <Integer> position;
private Tuple(String filepath, int wordfreq,List position) {
this.filepath = filepath;
this.wordfreq=wordfreq;
this.position = position;
}
public List<Integer> getPosition(){return position; }
public String getfilePath(){return filepath;}
public int getfreq(){return wordfreq;}
@Override
private boolean equals(Object o) {
if (!(o instanceof Tuple)) return false;
Tuple t = (Tuple) o;
return this.filepath.equals(t.fname());
}
}