0

我有以下文本文件包含将添加到树形图中的信息。

1 apple
1 orange
3 pear
3 pineapple
4 dragonfruit

我的代码:

public class Treemap {

    private List<String> fList = new ArrayList<String>();
    private TreeMap<Integer, List<String>> tMap = new TreeMap<Integer, List<String>>();

    public static void main(String[] args) {
        Treemap tm = new Treemap();
        String file = "";
        if (args.length == 1) {
            file = args[0];

            try {
                tm.Read(file);
            } catch (IOException ex) {
                System.out.println("Error");
            }

        } else {
            System.out.println("Usage: java treemap 'Filename'");
            System.exit(1);
        }
    }
    public void Read(String file) throws IOException {
        //Scanner in = null;
        BufferedReader in = null;
        InputStream fis;

        try {
            fis = new FileInputStream(file);
            in = new BufferedReader(new InputStreamReader(fis));
            String line = null;
            while ((line = in.readLine()) != null) {

                String[] file_Array = line.split(" ", 2);

                if (file_Array[0].equalsIgnoreCase("1")) {
                    Add(Integer.parseInt(file_Array[0]), file_Array[1]);
                    Display(1);
                } else if (file_Array[0].equalsIgnoreCase("3")) {
                    Add(Integer.parseInt(file_Array[0]), file_Array[1]);
                    Display(3);
                } else if (file_Array[0].equalsIgnoreCase("4")) {
                    Add(Integer.parseInt(file_Array[0]), file_Array[1]);
                    Display(4);
                }
            }
        } catch (IOException ex) {
            System.out.println("Input file " + file + " not found");
            System.exit(1);
        } finally {

            in.close();

        }
    }
    public void Add(int item, String fruit) {
        if (tMap.containsKey(item) == false) {
            tMap.put(item, fList);
            fList.add(fruit);
            System.out.println("Fruits added " + item);
        } else {
            System.out.println("not exist");
        }
    }
    public void Display(int item) {

        if (tMap.containsKey(item)) {
            System.out.print("Number " + item + ":" + "\n");
             System.out.print(fList);
            System.out.print("\n");
        } else {
            System.out.print(item + " WAS NOT FOUND"+ "\n");
        }

    }
}

理想输出

Number 1:
[apple, orange]

Number 3:
[pear, pineapple]

Number 4:
[dragonfruit]

目前我只能输出这个

Fruits added 1
Number 1:
[apple]
not exist
Number 1:
[apple]
Fruits added 3
Number 3:
[apple, pear]
not exist
Number 3:
[apple, pear]
Fruits added 4
Number 4:
[apple, pear, dragonfruit]

我应该如何显示添加到该数字的水果列表后面的项目?

4

4 回答 4

3

试试这个代码。它的工作。顺便说一句,您应该改进此代码。代码未优化。

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import java.util.TreeMap;

public class Treemap {

private List<String> fList = new ArrayList<String>();
private TreeMap<Integer, List<String>> tMap = new TreeMap<Integer, List<String>>();

public static void main(String[] args) {
    Treemap tm = new Treemap();
    String file = "";
    if (args.length == 1) {
        file = args[0];

        try {
            tm.Read(file);
        } catch (IOException ex) {
            System.out.println("Error");
        }

    } else {
        System.out.println("Usage: java treemap 'Filename'");
        System.exit(1);
    }
}
public void Read(String file) throws IOException {
    //Scanner in = null;
    BufferedReader in = null;
    InputStream fis;

    try {
        fis = new FileInputStream(file);
        in = new BufferedReader(new InputStreamReader(fis));
        String line = null;
        while ((line = in.readLine()) != null) {

            String[] file_Array = line.split(" ", 2);

            if (file_Array[0].equalsIgnoreCase("1")) {
                Add(Integer.parseInt(file_Array[0]), file_Array[1]);
               // Display(1);
            } else if (file_Array[0].equalsIgnoreCase("3")) {
                Add(Integer.parseInt(file_Array[0]), file_Array[1]);
               // Display(3);
            } else if (file_Array[0].equalsIgnoreCase("4")) {
                Add(Integer.parseInt(file_Array[0]), file_Array[1]);
               // Display(4);
            }
        }
    } catch (IOException ex) {
        System.out.println("Input file " + file + " not found");
        System.exit(1);
    } finally {
        for(int i: tMap.keySet())
            Display(i);
        in.close();

    }
}
public void Add(int item, String fruit) {
    if (tMap.containsKey(item) == false) {
        fList = new ArrayList<>();
        fList.add(fruit);
        tMap.put(item, fList);

       // System.out.println("Fruits added " + item);
    } else {
        tMap.get(item).add(fruit);
       // System.out.println("not exist");
    }
}
public void Display(int item) {

    if (tMap.containsKey(item)) {
        System.out.print("Number " + item + ":" + "\n");
         System.out.print(tMap.get(item));
        System.out.print("\n");
    } else {
        System.out.print(item + " WAS NOT FOUND"+ "\n");
    }

}

}

于 2013-10-23T05:41:36.403 回答
1

您使代码变得不必要的复杂。尝试使用简单的代码。

public class Treemap {

    public static void main(String[] args) throws FileNotFoundException {
        Scanner sc = new Scanner(new File("file.txt"));
        Map<Integer, List<String>> tMap = new TreeMap<>();

        while (sc.hasNextLine()) {
            String line = sc.nextLine();
            String[] values=line.split(" ");
            List<String> fList;
            Integer key=Integer.valueOf(values[0]);
            if(tMap.containsKey(key)){//Key already inserted
                fList=tMap.get(key); //Get existing List of key
                fList.add(values[1]);
            }
            else{
                fList = new ArrayList<String>();
                fList.add(values[1]);
                tMap.put(key, fList);
            }
        }
        for (Map.Entry<Integer, List<String>> entry : tMap.entrySet()) {
            System.out.println(entry.getKey());
            System.out.println(entry.getValue());
        }

    }
}

输出:

1
[apple, orange]
3
[pear, pineapple]
4
[dragonfruit]
于 2013-10-23T05:34:54.113 回答
1

更改 Add() 方法的一些代码,这在您的代码中不正确。

如果 Map 包含密钥怎么办?

以下代码是根据您的代码修改的,希望对您有所帮助。

public void Add(int item, String fruit) {
    if (tMap.containsKey(item)==false) {
        fList.clear();
        fList.add(fruit);
        tMap.put(item, fList);

        System.out.println("Fruits added " + item);
    } else {
        tMap.get(item).add(fruit);
    }
}
于 2013-10-23T05:43:46.427 回答
1

这是您的 READ 、 ADD ad DISPLAY 方法,

public void Read(String file) throws IOException {
        BufferedReader in = null;
        InputStream fis;

        try {
            fis = new FileInputStream(file);
            in = new BufferedReader(new InputStreamReader(fis));
            String line = null;
            while ((line = in.readLine()) != null) {
                String[] file_Array = line.split(" ", 2);
                Add(Integer.parseInt(file_Array[0]),file_Array[1]);
            }
            Display(-1); // -1 for displaying all
        } catch (IOException ex) {
            System.out.println("Input file " + file + " not found");
            System.exit(1);
        } finally {
            in.close();
        }
    }

    public void Add(int item, String fruit) {
        if (tMap.containsKey(item)) {
            fList = tMap.get(item);
        } else {
            fList = new ArrayList<String>();
        }
        fList.add(fruit);
        tMap.put(item, fList);
    }

    public void Display(int key) {
    if(key == -1){
        for (Map.Entry<Integer, List<String>> entry : tMap.entrySet()) {
            System.out.println(entry.getKey());
            System.out.println(entry.getValue());
        }
    }else{
        System.out.println(key);
        System.out.println(tMap.get(key));
    }

}
于 2013-10-23T05:56:27.177 回答