【问题标题】:how to edit my compare method如何编辑我的比较方法
【发布时间】:2012-08-01 07:32:11
【问题描述】:

我想比较我的两个 txt 文件的内容并将不同的单词写入其他 file3.txt 文件中

我想用这种方式做比较方法来写另一个txt文件。我也不 编码有错误

我没有结果。这是我的代码

【问题讨论】:

  • 在哪里不编译?请告诉我们您的错误信息
  • "it doesn't compile" => 然后您应该会收到一条编译错误消息,其中包含行号。你读过吗?
  • 确实编译,检查它。只有一个未使用的 var,writer
  • 但是 deneme3.txt 我没有看到 deneme1.txt 和 deneme2.txt 之间的不同词。写作要怎么做?
  • @Jes 你说它不能编译。现在您似乎说它确实可以编译,但并没有按照您的预期执行,这是完全不同的。

标签: java arrays string compare filewriter


【解决方案1】:

我已将您的代码简化并更正为:

public class TextAreaSample
{
  public static void main(String [] args) throws IOException {
    compare(readFileAsList("deneme1.txt"),
            readFileAsList("deneme2.txt"));
  }

  private static void compare(List<String> strings1, List<String> strings2)
  throws IOException
  {
    final Collator c = Collator.getInstance();
    c.setStrength(Collator.PRIMARY);
    final SortedSet<String>
      union = new TreeSet<String>(c),
      intersection = new TreeSet<String>(c);
    union.addAll(strings1);
    union.addAll(strings2);
    intersection.addAll(strings1);
    intersection.retainAll(strings2);
    union.removeAll(intersection);
    write(union, "deneme3.txt");
  }

  private static void write(Collection<String> out, String fname) throws IOException {
    FileWriter writer = new FileWriter(new File(fname));
    try { for (String s : out) writer.write(s + "\n"); }
    finally { writer.close(); }
  }

  private static List<String> readFileAsList(String name) throws IOException {
    final List<String> ret = new ArrayList<String>();
    final BufferedReader br = new BufferedReader(new FileReader(name));
    try {
      String strLine;
      while ((strLine = br.readLine()) != null) ret.add(strLine);
      return ret;
    } finally { br.close(); }
  }
}

我有 deneme1.txt:

plane
horoscope
microscope

deneme2.txt:

phone
mobile
plane

在 deneme3.txt 中输出:

horoscope
microscope
mobile
phone

【讨论】:

  • 你的示例文件比我的更有创意(诚然以极客的方式);-)
  • @assylias :) 我实际上看到了您的示例,并认为如果使用真实的单词会有助于提高可读性。
  • 真丢脸 - 我的版本更糟糕(看 - 我告诉过你我不是专业人士!)
  • @assylias 嘿嘿,我其实有点作弊,我在 SO 学到了这个!请注意,您的版本的主要问题不是忽略大小写。
  • 杰斯。 1. 您发布的确切代码写入文件,由@assylias 确认。 2. 我的代码写入文件,我已确认。您声称都不写文件。我真的不知道如何帮助你。
【解决方案2】:

我刚刚使用以下文件运行了您的程序,但无法重现您的问题。

deneme1

abc
def
ghi

deneme2

abc
ghi
klm

deneme3 的创建内容如下:

abc
ghi

编辑

您似乎想要相反的行为。您的一些方法不必要地复杂,并且可以通过使用标准 JDK 的正确工具来缩短。请参阅下面的简化实现示例(仅保留两个文件之间不通用的单词)-此示例区分大小写

public class TextAreaSample {

    public static void main(String[] args) throws IOException {
        //readAllLines does what you do in readFileAsList
        List<String> strings1 = Files.readAllLines(Paths.get("C:/temp/deneme1.txt"), Charset.defaultCharset());
        List<String> strings2 = Files.readAllLines(Paths.get("C:\\temp\\deneme2.txt"), Charset.defaultCharset());
        Set<String> notInCommon = getNotInCommon(strings1, strings2);
        write(notInCommon, "C:\\temp\\deneme3.txt");
    }

    private static void write(Collection<String> out, String fname) throws IOException {
        FileWriter writer = new FileWriter(new File("C:\\temp\\deneme3.txt"));
        for (String s : out) {
            writer.write(s + "\n");
        }
        writer.close();
    }

    private static Set<String> getNotInCommon(List<String> strings1, List<String> strings2) {
        //Sets are great to get unique lists and check commonality
        Set<String> onlyInFile1 = new HashSet<String>(strings1);
        onlyInFile1.removeAll(strings2); //remove strings in s1 AND s2
        Set<String> onlyInFile2 = new HashSet<String>(strings2);
        onlyInFile2.removeAll(strings1); //remove strings in s1 AND s2
        Set<String> notInCommon = new HashSet<>();
        notInCommon.addAll(onlyInFile1);
        notInCommon.addAll(onlyInFile2);

        return notInCommon;
    }
}

【讨论】:

  • 这实际上与他想要的完全相反。 ^^ 也许这是他的问题?但是,这个问题的表述非常糟糕...... ;)
  • @brimborium 老实说,我仍然不知道问题是什么,也不知道他的期望是什么……但你可能是对的!
  • @brimborium 他说了一件事,然后他的代码显然做了相反的事情。但是,该代码对最后一个字母是正确的,并且与发布的完全相同。很明显,有不同解释的空间。他还说他的代码无法编译,所以也许信任代码而不是文字?
  • @brimborium 根据我的 SO 经验,我们从 OP 那里获得更多信息的机会正在逐渐减少,现在大约为 10% :)
  • 顺便说一句,@assylias:非常好的编辑。不要认为你必须创建三个SetonlyInFile2.addAll(onlyInFile2); return onlyInFile2; 就足够了,我认为不会降低可读性。
【解决方案3】:

您打开第三个文件deneme3.txt 两次,但中间没有关闭它。我猜第二次(在write())会抛出异常,所以不会写。删除第一次出现的FileWriter writer = new FileWriter(new File("D:\\Denemeler\\deneme3.txt"));compare() 中的那个)应该没问题。

【讨论】:

    【解决方案4】:

    我的建议是不要试图一次性解决所有问题。 您可以通过使用一个班轮来简化您的比较方法 strings1.retainAll(strings2)

    更多信息请看这里 http://docs.oracle.com/javase/6/docs/api/java/util/Collection.html#retainAll(java.util.Collection)

    并打印strings1的内容,看看是否可以,然后解决文件写入部分。

    【讨论】:

    • 也不清楚你想要实现什么。在问题描述中,您说您想打印不同的单词,但在代码中您似乎以另一种方式进行。你可以使用 retainAll/removeAll 来实现你想要的。
    【解决方案5】:

    我认为你必须在关闭之前刷新()你的作家。

    private static void write(ArrayList<String> out, String fname) throws IOException {
        FileWriter writer = new FileWriter(new File("D:\\Denemeler\\deneme3.txt"));
        for (int i = 0; i < out.size(); i++) {
            writer.write(out.get(i) + "\n");
        }
        // Flush the writer before closing it.
        writer.flush();
    
        writer.close();
    }
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多