Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.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检测txt文件上的重复元组[fi,(j-1),fi,j,fi,j+;1]_Java_Algorithm_Csv_Data Structures_Edit - Fatal编程技术网

使用java检测txt文件上的重复元组[fi,(j-1),fi,j,fi,j+;1]

使用java检测txt文件上的重复元组[fi,(j-1),fi,j,fi,j+;1],java,algorithm,csv,data-structures,edit,Java,Algorithm,Csv,Data Structures,Edit,我正在寻找一个小的代码片段,它将在文件的(a)行中查找并检测,并提醒用户该行包含(s)个不可接受的条目 但是找不到 例如,我在一个文件中有以下内容: myFile.txt: Field1,Field2,Field3,Field4,Field5,Field6,Field7 a,b,a,d,e,f,g h,i,h,i,h,ff,f27 f31,f32,f33,f34,f35,f36,f37 f41,f42,f43,f44,f45,f46,f47 f51,f52,f53,f54,f55,f56,f57

我正在寻找一个小的代码片段,它将在文件的(a)行中查找并检测,并提醒用户该行包含(s)个不可接受的条目
但是找不到

例如,我在一个文件中有以下内容:

myFile.txt:

Field1,Field2,Field3,Field4,Field5,Field6,Field7
a,b,a,d,e,f,g
h,i,h,i,h,ff,f27
f31,f32,f33,f34,f35,f36,f37
f41,f42,f43,f44,f45,f46,f47
f51,f52,f53,f54,f55,f56,f57
f61,f62,a,b,a,f66,f67
f71,f72,f73,f74,f75,f76,f77
f81,f82,f83,f84,f85,f86,f87
f91,f92,f93,f94,f95,f96,f97
f101,f102,f103,f104,f105,f106,f107
f111,f112,f113,f114,f115,f116,f117
f121,f122,f123,f124,f125,f126,f127
f131,f132,f133,f134,f135,f136,f137
f141,f142,f143,f144,f145,f146,f147
f151,f152,f153,f154,f155,f156,f157
f161,a,b,a,f165,f166,f167
i,h,ff,f174,f175,f176,f177
f181,f182,f183,f184,f185,f186,f187
f191,f192,f193,f194,f195,f196,f197
f201,f202,f203,f204,f205,f206,f207
f211,f212,f213,f214,f215,f216,f217
f221,f222,f223,f224,f225,f226,f227
f231,f232,f233,f234,f235,f236,f237
f241,f242,f243,f244,f245,f246,f247
f251,f252,f253,f254,f255,f256,f257
f261,f262,f263,f264,f265,f266,f267
f271,f272,f273,f274,f275,f276,f277
f281,f282,f283,i,h,ff,f287
fn1,fn2,fn3,fn4,fn5,fn6,fn7
f301,f302,f303,f304,f305,f306,f307
TXT文件上的所有值都被视为字符串

不可接受的条目 一行(或多行)中不可接受的entrie是指包含fi,j的行,其中元组[fi,(j-1),fi,j,fi,j+1]在txt文件之前或之后已经存在。i、 e对于目标字段X,检测左XL上的字段和右XR上的字段是否与txt文件中的任何前一个字段不匹配,因此如果匹配,我们必须输出:行号上的字段X有问题,因为元组[XL,X,XR]已在前一行号上定义
我们可以说: -所有会引起冲突的线路:这意味着, +前一行(第一次出现在txt文件中时将被接受) (阅读)及 +有问题的行(在txt文件读取上一行之后) 因此将被忽略)
-已接受但已接受的第一个出现元组的行号 -将被忽略的未接受元组的最终行号 -导致问题的元组[XL,X,XR]

例如:

Field1;Field2;Field3;Field4;Field5;Field6;Field7<--------Headers
a;b;a;d;e;f;g
h;i;h;i;h;ff;f27
f31;f32;f33;f34;f35;f36;f37
f41;f42;f43;f44;f45;f46;f47
f51;f52;f53;f54;f55;f56;f57
f61;f62;a;b;a;f66;f67
............................
f161;a;b;a;f165;f166;f167
i;h;ff;f174;f175;f176;f177
...........................
f281;f282;f283;i;h;ff;f287
fn1;fn2;fn3;fn4;fn5;fn6;fn7
注意:如果接受行列表为空,即问题发生在同一行时,将显示“完全不接受”

欢迎任何建议、帮助

使现代化 我回答了


非常感谢。

这里有一个解决方案,如果需要可以使用

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Objects;
import java.util.Set;
import java.util.TreeSet;

    import java.io.BufferedReader;

    public class TextFileProgram {

      private static <T> Set<T> findDuplicates(Collection<T> list) {

        Set<T> duplicates = new LinkedHashSet<T>();
        Set<T> uniques = new HashSet<T>();

        for(T t : list) {
          if(!uniques.add(t)) {
            duplicates.add(t);
          }
        }

        return duplicates;
      }

      private static boolean hasDuplicates(HashMap<Integer, List<String>> datamap) {
        boolean status = false;

        Set valueset = new HashSet(datamap.values());

        if(datamap.values().size() != valueset.size()) {
          status = true;
        }
        else {
          status = false;
        }

        return status;

      }

      static HashMap<Integer, List<String>> findTriplets(ArrayList<Line> data) {

        HashMap<Integer, List<String>> hm = new HashMap<Integer, List<String>>();
        int j = 0;
        for(int i = 0; i < data.size(); i++) {
          String line = data.get(i).toString();
          String[] arr = line.split(",");

          final int L = arr.length;
          final int K = 3;
          List<String> list = new ArrayList<String>(Arrays.asList(arr));
          list.addAll(list.subList(0, K - 1));

          for(int z = 0; z < L - 2; z++) {
            hm.put(j, list.subList(z, z + K));
            j++;
          }

        }
        return hm;
      }

      public static <T, E> Set<T> getKeysByValue(Map<T, E> map, E value) {
        Set<T> keys = new HashSet<T>();
        for(Entry<T, E> entry : map.entrySet()) {
          if(Objects.equals(value, entry.getValue())) {
            keys.add(entry.getKey());
          }
        }
        return keys;
      }

      public static boolean getDataFromFile() {

ArrayList<Line> data = new ArrayList<Line>();

FileInputStream fis = null;
BufferedReader br = null;
boolean done = false;
String result1 = "";
String line = "";
String result2 = "";

try {

  File mFile = new File("C:\\siebog-master\\maven-demo\\" + "TestTuples.txt");
  fis = new FileInputStream(mFile);
  br = new BufferedReader(new InputStreamReader(fis));
  int iteration = 0;
  while((line = br.readLine()) != null) {

    if(iteration < 1) {
      iteration++;
      result1 = result1 + line + System.getProperty("line.separator");
      continue;
    }
    String[] pair = line.split(",");
    data.add(new Line(pair[0], pair[1], pair[2], pair[3], pair[4], pair[5], pair[6]));
  }

  HashMap<Integer, List<String>> hm = findTriplets(data);

  boolean isContainingDuplicates = hasDuplicates(hm);

  if(isContainingDuplicates) {
    Collection<List<String>> valuesList = hm.values();
    Set<List<String>> set = findDuplicates(valuesList);
    Set<Integer> setOfAlreadyRejected = new HashSet<Integer>();
    for(List<String> li : set) {

      Set<String> setToTestForDuplicate = new HashSet<String>(li);
      Set<Integer> myKeySet = getKeysByValue(hm, li);
      int index = 0;
      boolean allreadyDone = false;
      ArrayList<Integer> sortedList = new ArrayList(myKeySet);
      Collections.sort(sortedList);

      for(Integer key : myKeySet) {

        if(index == 0) {
          String value = hm.get(key).toString();
          System.out.print(value);

        }
        index++;
        if(setToTestForDuplicate.size() < li.size() && !allreadyDone) {
          System.out.print(", Not accepted at all. rejected on lines: ");
          System.out.println((key / 5 + 2) + " ");// number of rejected
          setOfAlreadyRejected.add(key / 5 + 2);// added to set of rejected
          System.out.println("Line accepted is: empty");
          System.out.print("Line rejected :");
          System.out.println(" " + data.get(key / 5));
          allreadyDone = true;
          break;
        }
        else if(set.size() >= li.size() || allreadyDone) {
          int z = 0;
          for(Integer s : sortedList) {
            boolean blnAlreadyExistsOnSetOfRejected = false;
            if(z == 0) {
              blnAlreadyExistsOnSetOfRejected = setOfAlreadyRejected.contains((Integer.valueOf(s) / 5 + 2));
              if(blnAlreadyExistsOnSetOfRejected) {
                System.out.print(" , Not accepetd on line ");
                System.out.print(" " + (Integer.valueOf(s) / 5 + 2)
                                 + "  because already rejected on the same line ");
                System.out.println(" " + (Integer.valueOf(s) / 5 + 2) + " ");
                System.out.print("Line rejected : ");
                System.out.println(" " + data.get(s / 5));

              }
              else {
                System.out.print(" , accepetd on line ");
                System.out.print(" " + (Integer.valueOf(s) / 5 + 2) + "  rejected on lines: ");

              }

            }
            else {

              System.out.println(" " + (Integer.valueOf(s) / 5 + 2) + " ");
              System.out.print("Line rejected : ");
              System.out.println(" " + data.get(s / 5));
            }
            z++;
          }
          System.out.println();
          break;
        }
      }
      System.out.println();
    }

  }

}
catch(FileNotFoundException ex) {

}
catch(IOException ex) {

}
catch(NullPointerException ex) {

}
finally {
  try {
    fis.close();
    br.close();
    done = true;
  }
  catch(IOException ex) {

  }
}
return done;

输出
这是一种物体的点。您应该创建一个对象模型来反映您正在使用的对象

首先创建一个类,类似这样的

public class SeptTuple {
  public final String field1, field2, ..., field7

  public SeptTuple(String f1, String f2, ..., String f7) {
    field1 = f1;
    ...
    field7 = f7;
  }

  @Override
  public boolean equals(Object o) {
    if(!(o instanceof SeptTuple))
      return false;

    SeptTuple s = (SeptTuple)o;
    return Objects.equals(field1, s.field1) && Objects.equals(field2, s.field2) && ... && Objects.equals(field7, s.field7)
  }

  @Override
  public int hashcode() {
    // If 2 objects are equal, they must return the same hashcode
    return Objects.hash(field1, field2, ..., field7);
  }
}
一旦你做到了这一点,就很容易找到被欺骗的人

Map<SeptTuple, SeptTuple> map = new HashMap<>();
....
// If already set, map will return the old value on put
SeptTuple temp = map.put(newSetTuple, newSetTuple);
if(temp != null) {
   // handle clash
}
Map Map=newhashmap();
....
//如果已经设置,map将在put时返回旧值
septuple temp=map.put(newsetuple,newsetuple);
如果(温度!=null){
//处理冲突
}

如果您需要在每行的子集中找到相等的部分,则可以将此解决方案分解为准确表示元组的每个元素所需的尽可能多的对象。(您需要创建3个类来表示元组的每个部分。)

,例如,建立元组的
映射到initialLine以跟踪已经看到的内容,或者类似的内容。Andreas我只需要一个如何有效处理该问题的建议。这就是我分享我的问题的原因。我可以自己解决我的问题。非常感谢您的帮助。我刚刚给了您:使用
地图
。非常感谢Andres。我将根据您的建议更新我的问题。我的意思是,如果您了解元组之类的概念,您也应该了解映射,因此,
Map
显然是跟踪唯一元组的有效方法,因此您应该能够尝试自己的实现,这就是为什么我投了反对票。为什么不创建一个元组类,重载equals和hashcode函数,然后使用这些函数的HashMap实现呢?这似乎需要做更多的工作。谢谢你,Tezra。你能举个例子来实现这一点吗。顺便说一下,你解释过了。谢谢。我意识到这很糟糕,但我现在能想到的才是真正有效的。我试过另一种方法,但我的知识不足以做到这一点。谢谢Tezra和Andreas,非常感谢Tezra。谢谢你的提示。我会根据你的指南更新我的代码。
public class Line implements Comparable<Line> {

  private String fieldOne;

  private String fieldTwo;

  private String fieldThree;

  private String fieldFour;

  private String fieldFive;

  private String fieldSix;

  private String fieldSeven;

  public Line(String fieldOne,
              String fieldTwo,
              String fieldThree,
              String fieldFour,
              String fieldFive,
              String fieldSix,
              String fieldSeven) {
    super();
    this.fieldOne = fieldOne;
    this.fieldThree = fieldThree;
    this.fieldFive = fieldFive;
    this.fieldSix = fieldSix;
    this.fieldFour = fieldFour;
    this.fieldTwo = fieldTwo;
    this.fieldSeven = fieldSeven;
  }

  public Line(String fieldOne) {
    super();
    this.fieldOne = fieldOne;
    this.fieldThree = "";
    this.fieldFive = "";
    this.fieldSix = "";
    this.fieldFour = "";
    this.fieldTwo = "";
    this.fieldSeven = "";
  }

  public Line(String fieldOne, String fieldTwo) {
    super();
    this.fieldOne = fieldOne;
    this.fieldThree = "";
    this.fieldFive = "";
    this.fieldSix = "";
    this.fieldFour = "";
    this.fieldTwo = fieldTwo;
    this.fieldSeven = "";
  }

  public Line(String fieldOne, String fieldTwo, String fieldThree) {
    super();
    this.fieldOne = fieldOne;
    this.fieldThree = fieldThree;
    this.fieldFive = "";
    this.fieldSix = "";
    this.fieldFour = "";
    this.fieldTwo = fieldTwo;
    this.fieldSeven = "";
  }

  public Line(String fieldOne, String fieldTwo, String fieldThree, String fieldFour) {
    super();
    this.fieldOne = fieldOne;
    this.fieldThree = fieldThree;
    this.fieldFive = "";
    this.fieldSix = "";
    this.fieldFour = fieldFour;
    this.fieldTwo = fieldTwo;
    this.fieldSeven = "";
  }

  public Line(String fieldOne, String fieldTwo, String fieldThree, String fieldFour, String fieldFive) {
    super();
    this.fieldOne = fieldOne;
    this.fieldThree = fieldThree;
    this.fieldFive = fieldFive;
    this.fieldSix = "";
    this.fieldFour = fieldFour;
    this.fieldTwo = fieldTwo;
    this.fieldSeven = "";
  }

  public Line(String fieldOne,
              String fieldTwo,
              String fieldThree,
              String fieldFour,
              String fieldFive,
              String fieldSix) {
    super();
    this.fieldOne = fieldOne;
    this.fieldThree = fieldThree;
    this.fieldFive = fieldFive;
    this.fieldSix = fieldSix;
    this.fieldFour = fieldFour;
    this.fieldTwo = fieldTwo;
    this.fieldSeven = "";
  }

  public String getFieldOne() {
    return fieldOne;
  }

  public void setFieldOne(String fieldOne) {
    this.fieldOne = fieldOne;
  }

  public String getFieldTwo() {
    return fieldTwo;
  }

  public void setFieldTwo(String fieldTwo) {
    fieldTwo = fieldTwo;
  }

  public String getFieldThree() {
    return fieldThree;
  }

  public void setFieldThree(String fieldThree) {
    this.fieldThree = fieldThree;
  }

  public String getFieldFour() {
    return fieldFour;
  }

  public void setCity(String fieldFour) {
    fieldFour = fieldFour;
  }

  public String getFieldFive() {
    return fieldFive;
  }

  public void setFieldFive(String fieldFive) {
    this.fieldFive = fieldFive;
  }

  public String getFieldSix() {
    return fieldSix;
  }

  public void setFieldSix(String fieldSix) {
    fieldSix = fieldSix;
  }

  public String getFieldSeven() {
    return fieldSeven;
  }

  public void setDetail(String fieldSeven) {
    fieldSeven = fieldSeven;
  }

  // Easy to print and show the row data
  @Override
  public String toString() {

    if(fieldTwo == null || fieldTwo.isEmpty())
      return fieldOne;
    else if(fieldThree == null || fieldThree.isEmpty())
      return fieldOne + "," + fieldTwo;
    else if(fieldFour == null || fieldFour.isEmpty())
      return fieldOne + "," + fieldTwo + "," + fieldThree;
    else if(fieldFive == null || fieldFive.isEmpty())
      return fieldOne + "," + fieldTwo + "," + fieldThree + "," + fieldFour;
    else if(fieldSix == null || fieldSix.isEmpty())
      return fieldOne + "," + fieldTwo + "," + fieldThree + "," + fieldFour + "," + fieldFive;
    else if(fieldSeven == null || fieldSeven.isEmpty())
      return fieldOne + "," + fieldTwo + "," + fieldThree + "," + fieldFour + "," + fieldFive + "," + fieldSix;
    else
      return fieldOne + "," + fieldTwo + "," + fieldThree + "," + fieldFour + "," + fieldFive + "," + fieldSix + ","
             + fieldSeven;
  }

  // sort based on column "fieldOne"
  @Override
  public int compareTo(Line o) {
    return this.fieldOne.compareTo(o.fieldOne);
  }
}
Field1,Field2,Field3,Field4,Field5,Field6,Field7
a,b,a,d,e,f,g
h,i,h,i,h,ff,f27
f31,f32,f33,f34,f35,f36,f37
f41,f42,f43,f44,f45,f46,f47
f51,f52,f53,f54,f55,f56,f57
f61,f62,a,b,a,f66,f67
f71,f72,f73,f74,f75,f76,f77
f81,f82,f83,f84,f85,f86,f87
f91,f92,f93,f94,f95,f96,f97
f101,f102,f103,f104,f105,f106,f107
f111,f112,f113,f114,f115,f116,f117
f121,f122,f123,f124,f125,f126,f127
f131,f132,f133,f134,f135,f136,f137
f141,f142,f143,f144,f145,f146,f147
f151,f152,f153,f154,f155,f156,f157
f161,a,b,a,f165,f166,f167
i,h,ff,f174,f175,f176,f177
f181,f182,f183,f184,f185,f186,f187
f191,f192,f193,f194,f195,f196,f197
f201,f202,f203,f204,f205,f206,f207
f211,f212,f213,f214,f215,f216,f217
f221,f222,f223,f224,f225,f226,f227
f231,f232,f233,f234,f235,f236,f237
f241,f242,f243,f244,f245,f246,f247
f251,f252,f253,f254,f255,f256,f257
f261,f262,f263,f264,f265,f266,f267
f271,f272,f273,f274,f275,f276,f277
f281,f282,f283,i,h,ff,f287
fn1,fn2,fn3,fn4,fn5,fn6,fn7
f301,f302,f303,f304,f305,f306,f307
[h, i, h], Not accepted at all. rejected on lines: 3 
Line accepted is: empty
Line rejected : h,i,h,i,h,ff,f27

[a, b, a], Not accepted at all. rejected on lines: 2 
Line accepted is: empty
Line rejected : a,b,a,d,e,f,g

[i, h, ff] , Not accepetd on line  3  because already rejected on the same line  3 
Line rejected :  h,i,h,i,h,ff,f27
 18 
Line rejected :  i,h,ff,f174,f175,f176,f177
 29 
Line rejected :  f281,f282,f283,i,h,ff,f287
public class SeptTuple {
  public final String field1, field2, ..., field7

  public SeptTuple(String f1, String f2, ..., String f7) {
    field1 = f1;
    ...
    field7 = f7;
  }

  @Override
  public boolean equals(Object o) {
    if(!(o instanceof SeptTuple))
      return false;

    SeptTuple s = (SeptTuple)o;
    return Objects.equals(field1, s.field1) && Objects.equals(field2, s.field2) && ... && Objects.equals(field7, s.field7)
  }

  @Override
  public int hashcode() {
    // If 2 objects are equal, they must return the same hashcode
    return Objects.hash(field1, field2, ..., field7);
  }
}
Map<SeptTuple, SeptTuple> map = new HashMap<>();
....
// If already set, map will return the old value on put
SeptTuple temp = map.put(newSetTuple, newSetTuple);
if(temp != null) {
   // handle clash
}