Java 如何处理列表<;元组>;

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

晚上好 我使用反向索引来存储包含这个单词的文件名的单词 使用HashMap:
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)


如何单独获取其元素

根据评论中的要求,我添加以下内容作为回答:

您希望能够通过以下方式区分元组:

  • 文件名
  • 引用(因为不同的引用表示文件中的不同单词)
因此,equals方法也应该比较这两个列表。这可以通过
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方法也应该比较这两个列表。这可以通过
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());
        }
}