首页 > 解决方案 > 使用 java 在 txt 文件中检测重复的元组 [fi,(j-1), fi,j ,fi,j+1]

问题描述

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

因此,例如,我在以下文件中有:

我的文件.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 文件中的所有值都被视为字符串。

不可接受的条目

一行(或多行)中不可接受的条目是包含 fi,j 的行,其中元组 [fi,(j-1), fi,j ,fi,j+1] 在 txt 文件之前或之后已经存在。即对于目标字段 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

它将显示:

[a;b;a], accepetd on line 1 but rejected on lines: 6,16
Line accepted is : a;b;a;d;e;f;g
Line(s) rejected are: f61;f62;a;b;a;f66;f67
                      f161;a;b;a;f165;f166;f167

[h;i;h], Not accepted at all. rejected on lines: 2 
Line accepted is: empty
Lines rejected :  h;i;h;i;h;ff;f27

[i;h;ff],Not accepted at all. rejected on lines: 2,17,28
Line accepted is: empty
Lines rejected :
             h;i;h;i;h;ff;f27
             i;h;ff;f174;f175;f176;f177
             f281;f282;f283;i;h;ff;f287

注意:如果接受行列表为空,即问题发生在同一行时,将显示根本不接受。

欢迎任何建议,帮助。

更新

我给出了答案。

非常感谢你。

标签: javaalgorithmcsvdata-structuresedit

解决方案


这就是对象的重点。您应该创建一个反映您正在使用的事物的对象模型。

所以首先你会创建一个类,像这样

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
}

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


推荐阅读