我有一个学校的作业,这是到目前为止我正在做的笔记

import java.io.*;
import java.util.Scanner;

public class UniquesDupesTester
{
    public static void main( String args[] ) throws IOException
    {
        // make a Scanner and associate it with "UniquesDupes.dat"
        // as long as there are Strings in the file

            // read in a String,
            // create a UniquesDupes object with it
            // print the object

            Scanner in = new Scanner(new File("UniquesDupes.dat"));



            while (in.hasNextLine())
            {
                String n = in.nextLine();
                UniquesDupes a = new UniquesDupes(n);
                a.getUniques();
                a.getDupes();
                System.out.println (a);
            }




    }
}


单独的文件

import java.util.Set;
import java.util.TreeSet;
import java.util.Arrays;
import java.util.ArrayList;

public class UniquesDupes
{
    private ArrayList<String> list;


    /**
     * constructs a UniquesDupes object such that list contains the space delimited strings
     * parsed from input
     * @param input a String containing the list of words separated by spaces
     */
    public UniquesDupes(String input)
    {
        list = new ArrayList<String>();

        String[] words = "abc cde fgh ijk".split(" ");
        ArrayList<String> list = new ArrayList<String>(Arrays.asList(words));
    }

    /**
     * returns a set of Strings containing each unique entry in the list
     */
    public Set<String> getUniques()
    {
        Set<String> uniques = new TreeSet<String>();

        for(String a:list)
        {
            uniques.add(a);
        }

        return uniques;
    }

    /**
     * returns a set of Strings containing each entry in the list that occurs more than once
     */
    public Set<String> getDupes()
    {
        Set<String> uniques = new TreeSet<String>();
        Set<String> dupes = new TreeSet<String>();

        for(String a:list)
        {
            uniques.add(a);
        {
            if(uniques.add(a) == false)
            {
                dupes.add(a);
            }
        }
        }


        return dupes;
    }

    /**
     * returns the original list, the list of duplicates and the list of uniques
     * @return the String version of the object
     */
    public String toString()
    {
        return "Orig list :: " + list
              + "\nDuplicates :: " + getDupes()
              + "\nUniques :: " + getUniques() + "\n\n";
    }
}


这是dat文件(如果需要)

a b c d e f g h a b c d e f g h i j k
one two three one two three six seven one two
1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 6


它可以编译并运行,但是所有文件都返回空白,我不知道我做错了什么,否则提示会很有价值

最佳答案

逻辑几乎是正确的。

UniquesDupes类几乎可以,但是构造函数不可以。应该是

public UniquesDupes() // no args, default constructor
{
    list = new ArrayList<String>(); //just initialize the list
}


同时,所述类将需要一个addString方法:

public void addString(String input) {
    String[] words = input.trim().split(" "); //split the input string into words by spaces, after trimming whitespace
    this.list.addAll(Arrays.asList(words)); //adding them to the list.
}


while循环应稍作更改。您只需要一个UniquesDupes类的实例,然后使用之前创建的addString方法添加每一行。

       UniquesDupes a = new UniquesDupes(); //create it here
       while (in.hasNextLine())
        {
            String n = in.nextLine();
            a.addString(n); //adding the string
        }


然后需要对结果进行不同的处理

            Collection<String> uniques = a.getUniques();
            Collection<String> dupes = a.getDupes();

            System.out.println (uniques.toString());
            System.out.println (dupes.toString());


也就是说,逻辑几乎是正确的...

但是,您所做的一件丑陋的事情是这部分:

    list = new ArrayList<String>(); //using instance variable

    String[] words = "abc cde fgh ijk".split(" ");
    ArrayList<String> list = new ArrayList<String>(Arrays.asList(words));
    // ^^ declaring local variable the same name as the instance variable


这是不好的。你不应该这样做。不,不。不要再做一次!养成这种习惯使代码异常难以阅读,并且疯狂地疯狂维护。

09-16 03:26