如果数组包含在另一个数组中,则从数组中删除值

时间:2015-09-12 09:02:47

标签: arrays ruby contain

我有两个数组

main_array = [[0,[1,4,5]], [1,[4,6,8]], [2,[5,6,7,8]], [3,[9,8]], [4,[7,2]]]
other_array = [[1,4,5],[9,8]]

我想要做的是删除main_array中的这些元素,如果它可以在other_array中找到。 (意思是我将留下[[1,[4,6,8]], [2,[5,6,7,8]],[4,[7,2]]])所以我做了以下事情:

other_array.each { |x|
for i in 0..main_array.length-1
  main_array.delete(x)
}

它不起作用。关于如何处理这个问题的任何线索?

2 个答案:

答案 0 :(得分:2)

main_array.reject { |_,a| other_array.include?(a) }
  #=> [[1,[4,6,8]], [2,[5,6,7,8]], [4,[7,2]]] 

答案 1 :(得分:0)

你可以使用Enumerable#reject(这是一个包含在Ruby中几乎所有集合中的模块,比如Arrays,Hashes,Sets等),它会根据某些条件返回带有删除元素的新数组:

item

此处main_arrayitem中的每个项目。你也可以打开"打开"如果您想单独控制其元素,则需要main_array.reject { |(key, val)| other_array.include? val }

public static void removeLine(String ans, String file) throws IOException {
    boolean foundLine = false;
    try (BufferedReader br = Files.newBufferedReader(Paths.get(file));
            BufferedWriter bw = Files.newBufferedWriter(Paths.get(file + ".tmp"))) {
        String line;
        while ((line = br.readLine()) != null) {
            String[] tokens = line.split("::", 2);
            if (tokens[0].equals(ans)) {
                foundLine = true;
            } else {
                if (foundLine) {
                    bw.write((Integer.parseInt(tokens[0]) - 1) + "::" + tokens[1]);
                } else {
                    bw.write(line);
                }
                bw.newLine();
            }
        }
    }
    Files.move(Paths.get(file + ".tmp"), Paths.get(file), StandardCopyOption.REPLACE_EXISTING);
}

我建议你去查看上面的链接,那边还有很多有趣的东西。