Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/396.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 检测使用滑动窗口概念生成的文件中的重复项_Java_Duplicates - Fatal编程技术网

Java 检测使用滑动窗口概念生成的文件中的重复项

Java 检测使用滑动窗口概念生成的文件中的重复项,java,duplicates,Java,Duplicates,我正在进行一个项目,在这个项目中,我必须解析一个文本文件,并将字符串分成用户指定长度的子字符串。然后我需要检测结果中的重复项 因此,原始文件将如下所示: Map<String, Integer> substringMap = new HashMap<>(); int index = 0; Set<String> duplicates = new HashSet<>(); 原点 1 GATCCCACCA TCTCGGTCTCCCAAGTGCT ag

我正在进行一个项目,在这个项目中,我必须解析一个文本文件,并将字符串分成用户指定长度的子字符串。然后我需要检测结果中的重复项

因此,原始文件将如下所示:

Map<String, Integer> substringMap = new HashMap<>();
int index = 0;
Set<String> duplicates = new HashSet<>();
原点
1 GATCCCACCA TCTCGGTCTCCCAAGTGCT aggattgcag gcctgagcca CCGCCCAG
61 ctgccttgtg cttttaatcc CAGCATTC AGGGCCAAG GCAGGCATC agctgaggtc
121 AGAGTTCAA GACCAGCTG gccaacatgg TGAACCCCA tctctaatac AAAAA
181 AAAAA CAAA aaacgttagc CAGGAGAG gcccggtgct tgtaatccta AGGAAGGA
241 CCACACTCC TCCTGCC CTTCTCC CCACCGCT tccttagttt ATAAACAGG
301嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎
我在文件上循环并生成一行字符串,然后使用
line.tocharray()
在结果行上滑动并根据用户规范进行分割。因此,如果子字符串的长度为4,则结果如下所示:

Map<String, Integer> substringMap = new HashMap<>();
int index = 0;
Set<String> duplicates = new HashSet<>();
GATC
美国标准菌库
TCCA
CCAC
中国民航局
ACCC
CCCA
CCAT
CATC
ATCT
TCTC
CTCG
TCGG
CGGT
GGTC
GTCT
TCTC
CTCC
TCCC
CCCA
CCAA
以下是我的拆分代码:

try {
    scanner = new Scanner(toSplit);
    while (scanner.hasNextLine()) {
        String line = scanner.nextLine();
        char[] chars = line.toCharArray();
        for (int i = 0; i < chars.length - (k - 1); i++) {
            String s = "";
            for(int j = i; j < i + k; j++) {
                s += chars[j];
            }
            if (!s.contains("N")) {
                System.out.println(s);
            }
        }
    }
}
试试看{
扫描仪=新扫描仪(toSplit);
while(scanner.hasNextLine()){
字符串行=scanner.nextLine();
char[]chars=line.toCharArray();
对于(int i=0;i

我的问题是:考虑到输入文件可能很大,如何检测结果中的重复项?

如果要检查重复项,最好选择一个集合来保存和测试数据。请告知您希望在哪个上下文中检测重复项:单词、行或“输出字符”

您可以这样做:

Map<String, Integer> substringMap = new HashMap<>();
int index = 0;
Set<String> duplicates = new HashSet<>();
然后可以轻松地拉出所有子字符串:

String[] substringArray = new String[substringMap.size()];
for (Map.Entry<String, Integer> substringEntry : substringMap.entrySet()) {
  substringArray[substringEntry.getValue()] = substringEntry.getKey();
}
String[]substringArray=新字符串[substringMap.size()];
对于(Map.Entry substringEntry:substringMap.entrySet()){
substringArray[substringEntry.getValue()]=substringEntry.getKey();
}
瞧!原始顺序的输出数组,没有重复项,加上一组所有重复的子字符串,性能非常好。

您可以使用一个或一个哈希表来检测可能的重复项,然后对文件进行第二次遍历,以检查这些“重复候选项”是否为真正的重复项

哈希表示例:

// First we make a list of candidates so we count the times a hash is seen
int hashSpace = 65536;
int[] substringHashes = new int[hashSpace];
for (String s: tokens) {
  substringHashes[s.hashCode % hashSpace]++; // inc
}

// Then we look for words that have a hash that seems to be repeated and actually see if they are repeated. We use a set but only of candidates so we save a lot of memory
Set<String> set = new HashSet<String>();
for (String s: tokens) {
  if (substringHashes[s.hashCode % hashSpace] > 1) {
    boolean repeated = !set.add(s);
    if (repeated) {
      // TODO whatever
    }
  }
}
//首先我们列出一个候选列表,这样我们就可以计算看到散列的次数
int hashSpace=65536;
int[]substringHashes=新的int[hashSpace];
for(字符串s:标记){
substringhash[s.hashCode%hashSpace]++;//inc
}
//然后,我们寻找有一个看似重复的散列的单词,并实际查看它们是否重复。我们只使用一组候选对象,因此节省了大量内存
Set=newhashset();
for(字符串s:标记){
if(substringHashes[s.hashCode%hashSpace]>1){
布尔值重复=!set.add(s);
如果(重复){
//不管怎么说
}
}
}

结果与输入的顺序相同重要吗?请注意,您可以将A、C、G、T编码为0,1,2,3,共2位,长度为4的子字符串的所有可能组合为您提供了4^4==256种可能性:您可以记住大小为256的数组中字符串的最后一个位置,并将冲突输出为放入数组中的块序列,以替换有效的position@BeyelerStudios他举了长度4作为例子。子字符串可以是任意长度。@RedRoboHood我怀疑是一个小字符计数-因此我指出了一种可能的方法,专门用于遗传数据或其他具有小字符集的字符串(这就是为什么它不是答案)@BeyelerStudios一个具有17个字符(4个字母=每个字符2位)的DNA字符串需要34位,无法装入单个
int
。因此,在这种情况下,您既不能使用普通数组,也不能使用哈希集。我需要检测重复的单词(子字符串)这是唯一的方法,在分割成第三个文件后重写结果,然后再逐行读取?我在上看到了解决方案,但现在我无法拆分文件并检测使用同一文件的重复项…我不会将结果重写到另一个文件中。您可以在启动时使用
Set wordSet=new HashSet()创建一个新集合
,在提取单词时使用
String word=“extracted”;if(wordSet.contains(word)){/…duplicate}else{wordSet.add(word);}
原则上这是一个很好的答案,但是对于大量数据(正如OP所指出的),这是低效的(与散列法相比)。此外,我认为OP希望检测重复项,而不是消除重复项(正如您上一段代码所建议的)。@BeyelerStudios正如我在回答中所说,如果您愿意,可以使用HashSet,并重写Subsequence类中的
hashCode
。在我的示例中,我选择不这样做,因为这不适用于较大的子字符串大小。要检测重复项但不消除重复项,您可以向比较器添加额外代码,比较器在每次发现重复项时都会记录。您错了:Set(扩展为HashSet)保证唯一元素
a
b
where
!a、 equals(b)
都可以添加-这不取决于它们的
hashCode()
HashSet
确实会包含插入其中的所有唯一字符串!编辑:@BeyelerStudios Ah,所以HashSet使用了
hashCode
equals
的组合?我一定忘了(但现在我不明白这怎么可能是真的)。我会记住这一点来更新我的答案。我大大简化了我的答案。