Java Read&;比较文本文件并按字母顺序打印单词

Java Read&;比较文本文件并按字母顺序打印单词,java,arrays,string,sorting,Java,Arrays,String,Sorting,首先,如果以前有人问过类似的问题,我很抱歉,但我找不到一个解决方案。所以我有一个小java程序,它比较两个文本文件(text1.txt和text2.txt),并打印text1.txt中不存在的所有单词。以下代码执行此任务: text1.txt:这是文本文件1。一些@random-text text2.txt:这是文本文件2 import java.io.*; import java.nio.charset.Charset; import java.nio.file.Files; import j

首先,如果以前有人问过类似的问题,我很抱歉,但我找不到一个解决方案。所以我有一个小java程序,它比较两个文本文件(text1.txt和text2.txt),并打印text1.txt中不存在的所有单词。以下代码执行此任务:

text1.txt:这是文本文件1。一些@random-text

text2.txt:这是文本文件2

import java.io.*;
import java.nio.charset.Charset;
import java.nio.file.Files;
import java.util.*;

public class Read {

   public static void main(String[] args) {
      Set<String> textFile1 = readFiles("text1.txt");
      Set<String> textFile2 = readFiles("text2.txt");

      for (String t : textFile1) {
         if (!textFile2.contains(t)) {
            System.out.println(t);
         }}}

   public static Set<String> readFiles(String filename) 
   {
      Set<String> words = new HashSet<String>();

      try {         
         for (String line : Files.readAllLines(new File(filename).toPath(), Charset.defaultCharset())) {    
            String[] split = line.split("\\s+");
            for (String word : split) {
               words.add(word.toLowerCase());
            }}} 
      catch (IOException e) {
         System.out.println(e);
      }
      return words;
   }
}
编辑:HashSet是这项工作的必备工具。对不起,我忘了 提到这一点


您是否看过任何其他
Set
实现?我认为如果使用
排序集
,例如
树集
,而不是
哈希集
,单词将自动按字母顺序排序


如果您一次只问一个问题,堆栈溢出效果会更好。

由于不允许您使用树集并强制使用哈希集,请按此方式执行

import java.io.*;
import java.nio.charset.Charset;
import java.nio.file.Files;
import java.util.*;

public class Read {

   public static void main(String[] args) {
      Set<String> textFile1 = readFiles("text1.txt");
      Set<String> textFile2 = readFiles("text2.txt");

      Set<String> difference = new HashSet<String>();

      // collect strings by dropping out every string that's not only letters
      // using the regex "[a-zA-Z]+"
      for (String t : textFile1) {
         if (!textFile2.contains(t) && t.matches("[a-zA-Z]+")) {
            difference.add(t);
         }
      }

      // sort
      List<String> dList = new ArrayList<String>(difference);
      Collections.sort(dList);

      // show
      for (String s : dList) {
         System.out.println(s);
      }
   }

   public static Set<String> readFiles(String filename) 
   {
      Set<String> words = new HashSet<String>();

      try {         
         for (String line : Files.readAllLines(new File(filename).toPath(), Charset.defaultCharset())) {    
            String[] split = line.split("\\s+");
            for (String word : split) {
               words.add(word.toLowerCase());
            }}} 
      catch (IOException e) {
         System.out.println(e);
      }
      return words;
   }
}
import java.io.*;
导入java.nio.charset.charset;
导入java.nio.file.Files;
导入java.util.*;
公开课阅读{
公共静态void main(字符串[]args){
设置textFile1=readFiles(“text1.txt”);
设置textFile2=readFiles(“text2.txt”);
Set difference=新的HashSet();
//收集字符串的方法是删除所有不只是字母的字符串
//使用正则表达式“[a-zA-Z]+”
for(字符串t:textFile1){
如果(!textFile2.contains(t)&&t.matches(“[a-zA-Z]+”)){
差异。添加(t);
}
}
//分类
列表数据列表=新的数组列表(差异);
Collections.sort(dList);
//展示
用于(字符串s:dList){
系统输出打印项次;
}
}
公共静态集读取文件(字符串文件名)
{
Set words=新HashSet();
试试{
对于(字符串行:Files.readAllLines(新文件(文件名).toPath(),Charset.defaultCharset()){
String[]split=line.split(\\s+);
for(字符串字:拆分){
words.add(word.toLowerCase());
}}} 
捕获(IOE异常){
系统输出打印ln(e);
}
返回单词;
}
}

根据我在java文档中读到的内容,a不能保证对集合中的元素进行排序。然而,若您要将其实现为一个组件,那个么它应该允许元素的排序,但您可能还需要为它制作一个比较器

至于你的其他问题,对于用java阅读文件,我发现“极客对极客”这本书对用户非常友好,特别是对初学者来说,它展示了各种读取文件的方法


特殊字符可能有点棘手,但有一个来自上一个堆栈溢出答案的指南可能会有所帮助。

让我们尝试将此问题划分为更小的子问题-也许您可以自己找到答案。要按字母顺序打印单词,您需要对它们进行排序-但首先需要在某个集合中收集它们。最简单的方法是计算集合
textFile1
textFile2
之间的差异。你知道怎么做吗?现在,假设你已经设置了
Set
,这就是上面提到的区别。如何对集合进行排序?接下来,您不需要某些“单词”,如特殊字符
@
-
或数字。你如何检查一个“单词”是否符合你的“愿望”模式?这是家庭作业吗?然后请阅读
TreeSet
的问题是
包含
删除
计算集合之间差异所需的操作是
O(log n)
。因此,最好使用
HashSet
计算差异,然后对结果集进行排序。
set difference=new TreeSet(textFile1);差异。删除所有(textFile2)
甚至比当前代码更简单。我看不出我们是如何用效率换取复杂性的。恰恰相反。(仅供参考)Better
Set difference=新树集(textFile1);差异。删除所有(textFile2)。(我没有投反对票)很好,但我的解决方案也有效,即使它不是高端解决方案。我不明白为什么人们投票否决我的帖子,因为这没有错。我个人认为这里没有什么值得否决的。谢谢你的支持。“我真的很感激。”恶魔之词谢谢你。这适用于a-z打印。这可以只使用HashSet来完成吗?&您将如何不打印专用字符?
import java.io.*;
import java.nio.charset.Charset;
import java.nio.file.Files;
import java.util.*;

public class Read {

   public static void main(String[] args) {
      Set<String> textFile1 = readFiles("text1.txt");
      Set<String> textFile2 = readFiles("text2.txt");

      Set<String> difference = new HashSet<String>();

      // collect strings by dropping out every string that's not only letters
      // using the regex "[a-zA-Z]+"
      for (String t : textFile1) {
         if (!textFile2.contains(t) && t.matches("[a-zA-Z]+")) {
            difference.add(t);
         }
      }

      // sort
      List<String> dList = new ArrayList<String>(difference);
      Collections.sort(dList);

      // show
      for (String s : dList) {
         System.out.println(s);
      }
   }

   public static Set<String> readFiles(String filename) 
   {
      Set<String> words = new HashSet<String>();

      try {         
         for (String line : Files.readAllLines(new File(filename).toPath(), Charset.defaultCharset())) {    
            String[] split = line.split("\\s+");
            for (String word : split) {
               words.add(word.toLowerCase());
            }}} 
      catch (IOException e) {
         System.out.println(e);
      }
      return words;
   }
}