【问题标题】:Reading 3 Text Files and Finding the Matching Number?阅读 3 个文本文件并找到匹配的数字?
【发布时间】:2015-08-11 18:23:57
【问题描述】:

这个程序需要从1个文本文件中读取“信用卡”号码,将它们与第二个进行比较,如果匹配,则将其与第三个进行比较,然后显示所有3个匹配的号码。

我遇到了很多麻烦,不知道出了什么问题。任何帮助将不胜感激。

import java.io.FileNotFoundException;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.FileReader;
import java.io.BufferedReader;

public class Search {

    public static void main(String[] args) throws IOException { //main method
        boolean match = false;
        String creditNumber = null;
        BufferedReader reader1 = new BufferedReader(new FileReader("creditCards1.txt"));
        creditNumber = reader1.readLine();
        while(match = false & creditNumber != null){
            System.out.println(creditNumber);
            boolean confirm = false;
            confirm = searchTwo(creditNumber);
            if(confirm == true){
                confirm = searchTwo(creditNumber);      
                System.out.println(confirm);
                break;
            }
        reader1.close();
        }


    }   

    public static boolean searchTwo(String creditNumber) throws IOException { //method for searching the 2nd text file

        boolean match = false;
        String creditNumber2 = null;
        BufferedReader reader2 = new BufferedReader(new FileReader("creditCards2.txt"));
        creditNumber2 = reader2.readLine();
        while(match = false & creditNumber != null){
            boolean confirm = false;
            confirm = searchThree(creditNumber2);
            if(confirm == true & creditNumber2.equals(creditNumber)){
                match = true;
                System.out.println(creditNumber2);
            }

            creditNumber2 = reader2.readLine();
        }
        reader2.close();
        if(match = true || creditNumber2 == null){
            return match;
        }
        return match;


    }       

public static boolean searchThree(String creditNumber) throws IOException { //method for searching the 3rd text file

        boolean match = false;
        String creditNumber3 = null;
        BufferedReader reader3 = new BufferedReader(new FileReader("creditCards3.txt"));
        creditNumber3 = reader3.readLine();

        while(match = false & creditNumber != null){

            if(creditNumber3.equals(creditNumber)){
                match = true;
                break;
            }
            creditNumber3 = reader3.readLine();     

        }
        reader3.close();
        if(match = true || creditNumber3 == null){
            return match;
        }

        return match;
    }

}

【问题讨论】:

  • 你卡在哪里了?您是否收到任何错误/异常?您必须提供更多详细信息
  • 你是只搜索所有文件中第一个匹配的信用卡,还是搜索所有3个文件中的所有信用卡(不止一个)?
  • 我只是没有得到任何输出。即使是第一个 System.out.println(creditNumber); 在程序运行时也不会打印。我搜索每个文件中的每个数字以查看它们是否匹配。基本上它是 3 个文本文档,每行都有一个新的 cc 编号。

标签: java file text match


【解决方案1】:

我发现这里有一些问题。

  1. 您永远不会在您的main 中设置match = true,因此它将永远循环。

  2. confirm = searchTwo(creditNumber);
    if(confirm == true){
        confirm = searchTwo(creditNumber);      
        System.out.println(confirm);
        break;
    }
    

    这段代码是多余的。

    只有当searchThree()返回true时,searchTwo()才会返回true。

  3. 您没有在 while 循环中检查相等性,您只是在设置变量。

    while(match = false & creditNumber != null) 
    

    应该改为:

    while(match == false && creditNumber != null)
    
  4. 您需要在 while 循环内读取一个新行,而不仅仅是在它之外读取一次。你目前的方式,你只是读取文件的第一行。

【讨论】:

    【解决方案2】:

    你能看看我的解决方案吗?它并不完美,但我认为它是可扩展的......

    我用以下信用卡文件创建了一个简单的项目:

    creditCards1.txt:

    5416247983974134
    5572941594858518
    5110952365939493
    5154933849210203
    5272835420269481
    

    creditCards2.txt:

    5562949040660851
    5139055358731815
    5154933849210203
    5152652348339972
    5382178174490350
    5272835420269481
    5564201755352300
    5572941594858518
    

    creditCards3a.txt:

    5121672532009148
    5328229152859756
    5272835420269481
    5258620703451297
    5154933849210203
    5411765815619689
    

    creditCards3b.txt:

    5121672532009148
    5328229152859756
    5258620703451297
    5411765815619689
    

    creditCards4.txt:

    5121672532009148
    5328229152859756
    5272835420269481
    5258620703451297
    5411765815619689
    

    然后我创建了以下junit测试用例:

    package creditcard.search;
    
    import java.io.File;
    import java.io.IOException;
    import java.util.Set;
    import static org.junit.Assert.assertEquals;
    import static org.junit.Assert.assertNotNull;
    import static org.junit.Assert.assertTrue;
    import org.junit.Before;
    import org.junit.Test;
    
    public class CreditCardSearchTest {
    
        private CreditCardSearch creditCardSearch;
    
        @Before
        public void setUp() {
            creditCardSearch = new CreditCardSearch();
            creditCardSearch.addCreditCardsFile(new File("creditCards1.txt"));
            creditCardSearch.addCreditCardsFile(new File("creditCards2.txt"));
        }
    
        @Test
        public void assert_creditcards_found_in_2_files() throws IOException {
            final Set<String> creditcards = creditCardSearch.searchForMatchesInAllFiles();
    
            assertNotNull(creditcards);
            assertEquals(3, creditcards.size());
            assertTrue("5154933849210203", creditcards.contains("5154933849210203"));
            assertTrue("5272835420269481", creditcards.contains("5272835420269481"));
            assertTrue("5572941594858518", creditcards.contains("5572941594858518"));
        }
    
        @Test
        public void assert_creditcards_found_in_3_files() throws IOException {
            creditCardSearch.addCreditCardsFile(new File("creditCards3a.txt"));
    
            final Set<String> creditcards = creditCardSearch.searchForMatchesInAllFiles();
    
            assertNotNull(creditcards);
            assertEquals(2, creditcards.size());
            assertTrue("5154933849210203", creditcards.contains("5154933849210203"));
            assertTrue("5272835420269481", creditcards.contains("5272835420269481"));
        }
    
        @Test
        public void assert_creditcards_not_found_in_3_files() throws IOException {
            creditCardSearch.addCreditCardsFile(new File("creditCards3b.txt"));
    
            final Set<String> creditcards = creditCardSearch.searchForMatchesInAllFiles();
    
            assertNotNull(creditcards);
            assertTrue(creditcards.isEmpty());
        }
    
        @Test
        public void assert_creditcards_found_in_4_files() throws IOException {
            creditCardSearch.addCreditCardsFile(new File("creditCards4.txt"));
    
            final Set<String> creditcards = creditCardSearch.searchForMatchesInAllFiles();
    
            assertNotNull(creditcards);
            assertEquals(1, creditcards.size());
            assertTrue("5272835420269481", creditcards.contains("5272835420269481"));
        }
    }
    

    最后但并非最不重要的实现:

    package creditcard.search;
    
    import java.io.File;
    import java.io.IOException;
    import java.nio.file.Files;
    import java.nio.file.Path;
    import java.util.HashMap;
    import java.util.HashSet;
    import java.util.Iterator;
    import java.util.List;
    import java.util.Map;
    import java.util.Set;
    
    public class CreditCardSearch {
    
        private final Set<File> files = new HashSet();
    
        public void addCreditCardsFile(final File file) {
            files.add(file);
        }
    
        public Set<String> searchForMatchesInAllFiles() throws IOException {
            if(files.size() < 2) {
                throw new IllegalArgumentException("a minimum of 2 creditcard files required");
            }
    
            final Map<Path, List<String>> linesPerPath = new HashMap<>();
            for(final File file : files) {
                final Path path = file.toPath();
                linesPerPath.put(path, Files.readAllLines(path));
            }
    
            final Set<String> creditcards = new HashSet();
    
            final Iterator<Path> it = linesPerPath.keySet().iterator();
    
            List<String> linesA = null;
    
            while (it.hasNext()) {
                if (null == linesA) {
                    linesA = linesPerPath.get(it.next());
                }
                List<String> linesB = linesPerPath.get(it.next());
                linesA.retainAll(linesB);
            }
    
            creditcards.addAll(linesA);
    
            return creditcards;
        }
    
    }
    

    junit 测试结果:

    -------------------------------------------------------------------------------
    Test set: creditcard.search.CreditCardSearchTest
    -------------------------------------------------------------------------------
    Tests run: 4, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.105 sec
    

    项目代码可以在GitHub上找到:https://github.com/StefanHeimberg/stackoverflow-31952730

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-04-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-22
      • 1970-01-01
      • 2021-08-02
      相关资源
      最近更新 更多