根据条件删除列表

时间:2019-03-20 15:32:35

标签: java

我有以下相互关联的ID:

[0, 0]
[1, 0]
[2, 1] --
[3, 0]
[4, 3]
[5, 1] **
[6, 0]
[7, 6]
[8, 5] **
[9, 3]
[10, 0]
[11, 10]
[12, 0]
[13, 12]
[14, 3]
[15, 1]
[16, 1]
[17, 3]
[18, 0]
[19, 18]
[20, 0]
[21, 20]
[22, 1]
[23, 2] --
[24, 0]
[25, 24]

其中每个代表唯一的ID,以及与之相关的另一个ID。例如,[9,3]表示ID 9取决于(或与之相关)ID3。但是,有几个ID 与同一个ID相关,例如,ID 4、9、14和17与ID 3有关。我想删除与同一个ID相关的ID,以便 删除重复项。为此,我遵循一些规则以确保删除正确的ID:

  1. 请勿删除任何与0相关的ID。例如,无法删除ID 3、6、10、12等。
  2. 应保留其中一个ID,并删除其他ID。例如,与ID为3的那些ID可以全部删除,但其中之一(例如4)除外。
  3. 确保一个ID不依赖于另一个ID。例如,与ID 1相关的IDS,我们可以删除15、16和22,但不能删除2和5,因为ID 23与2相关 并且ID 8与5有关。
  4. 删除已经涵盖的从属ID。例如,如上一条规则中所述,ID 2和5与1相关,但两者都具有其他ID的依赖性(23取决于2) 和(8取决于5)。在这种情况下,我们必须删除其中一个,并保留另一个,因为两者都与主ID为1有关。

在上面的示例中应用这些规则的结果将是删除以下ID:

5、8、9、14、15、16、17、22

我执行了以下规则:

List<List<Integer>> dependency = new ArrayList<List<Integer>>();
List<Integer> coveredID = new ArrayList<Integer>();
List<Integer> dependentID = new ArrayList<Integer>();
List<Integer> removedID = new ArrayList<Integer>();

int x1 = 0, x2 = 0;

try (BufferedReader br = new BufferedReader(new FileReader("/home/as/Desktop/Temp/statements"))) { // here I read the file that contains the information of IDs
  String line;
  while ((line = br.readLine()) != null) {
    String[] parts = line.split(" ");
    x1 = Integer.valueOf(parts[1].trim()); // to store the ID
    x2 = Integer.valueOf(parts[5].trim()); // to store what the ID relates to

    List<Integer> a = new ArrayList<Integer>();
    a.add(x1);
    a.add(x2);
    dependency.add(a);

    if(!(dependentID.contains(x2))) {
      dependentID.add(x2);
    }
  }
}

for(List<Integer> x: dependency) {
  x1 = x.get(0);
  x2 = x.get(1);
  if(coveredID.contains(x2) && !(dependentID.contains(x1))) {
    if(x2 != 0) {
      removedID.add(x1);
    }
  }else{
    coveredID.add(x2);
  }
}

除最后一条规则外,它都可以正常工作。您知道我可以在代码中添加些什么来使其正常工作吗?

0 个答案:

没有答案