Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/351.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java-将StringTokenizer保存到数组中,以便在其他方法中进行进一步处理_Java_Dependencies_Stringtokenizer - Fatal编程技术网

Java-将StringTokenizer保存到数组中,以便在其他方法中进行进一步处理

Java-将StringTokenizer保存到数组中,以便在其他方法中进行进一步处理,java,dependencies,stringtokenizer,Java,Dependencies,Stringtokenizer,我已经编写了很多Perl和Python代码,这次我被指派用Java编写代码。所以我不太熟悉用Java处理数据 我的任务包括创建一个输入文件,在该文件中我需要检查依赖项,然后输出具有可传递依赖项的依赖项。更清晰的想法如下: 输入文件: A: B C B: C E C: G D: A 输出文件: A: B C E G B: C E G C: G D: A B C E G 到目前为止,我得到的是(分离第一个和第二个令牌): 谢谢你的帮助。我可以想象Perl或Python可以轻松地处理这个问题。只需

我已经编写了很多Perl和Python代码,这次我被指派用Java编写代码。所以我不太熟悉用Java处理数据

我的任务包括创建一个输入文件,在该文件中我需要检查依赖项,然后输出具有可传递依赖项的依赖项。更清晰的想法如下:

输入文件:

A: B C
B: C E
C: G
D: A
输出文件:

A: B C E G
B: C E G
C: G
D: A B C E G
到目前为止,我得到的是(分离第一个和第二个令牌):


谢谢你的帮助。我可以想象Perl或Python可以轻松地处理这个问题。只需要在Java中实现它。

这在内存方面不是很有效,需要良好的输入,但应该运行良好

String s = "A: B C D";
String i = s.split(":")[0];
String dep[] = s.split(":")[1].trim().split(" ");
System.out.println("i = "+i+", dep = "+Arrays.toString(dep));
public class NodeParser {

    // Map holding references to nodes
    private Map<String, List<String>> nodeReferenceMap;

    /**
     * Parse file and create key/node array pairs
     * @param inputFile
     * @return
     * @throws IOException
     */
    public Map<String, List<String>> parseNodes(String inputFile) throws IOException {

        // Reset list if reusing same object
        nodeReferenceMap = new HashMap<String, List<String>>();

        // Read file
        FileInputStream fstream = new FileInputStream(inputFile);
        BufferedReader br = new BufferedReader(new InputStreamReader(fstream));
        String strLine;

        // Parse nodes into reference mapping
        while((strLine = br.readLine()) != null) {
            // Split key from nodes
            String[] tokens = strLine.split(":");
            String key = tokens[0].trim();
            String[] nodes = tokens[1].trim().split(" ");
            // Set nodes as an array list for key
            nodeReferenceMap.put(key, Arrays.asList(nodes));
        }

        // Recursively build node mapping
        Map<String, Set<String>> parsedNodeMap = new HashMap<String, Set<String>>();
        for(Map.Entry<String, List<String>> entry : nodeReferenceMap.entrySet()) {
            String key = entry.getKey();
            List<String> nodes = entry.getValue();
            // Create initial node set
            Set<String> outSet = new HashSet<String>();
            parsedNodeMap.put(key, outSet);
            // Start recursive call
            addNode(outSet, nodes);
        }

        // Sort keys
        List<String> sortedKeys = new ArrayList<String>(parsedNodeMap.keySet());
        Collections.sort(sortedKeys);

        // Sort nodes
        Map<String, List<String>> sortedParsedNodeMap = new LinkedHashMap<String, List<String>>();
        for(String key : sortedKeys) {
            List<String> sortedNodes = new ArrayList<String>(parsedNodeMap.get(key));
            Collections.sort(sortedNodes);
            sortedParsedNodeMap.put(key, sortedNodes);
        }

        // Return sorted key/node mapping
        return sortedParsedNodeMap;
    }

    /**
     * Recursively add nodes by referencing the previously generated list mapping
     * @param outSet
     * @param nodes
     */
    private void addNode(Set<String> outSet, List<String> nodes) {
        // Add each node to the set mapping
        for(String node : nodes) {
            outSet.add(node);
            // Get referenced nodes
            List<String> nodeList = nodeReferenceMap.get(node);
            if(nodeList != null) {
                // Create array list from abstract list for remove support
                List<String> referencedNodes = new ArrayList<String>(nodeList);
                // Remove already searched nodes to prevent infinite recursion
                referencedNodes.removeAll(outSet);
                // Recursively search more node paths
                if(!referencedNodes.isEmpty()) {
                    addNode(outSet, referencedNodes);
                }
            }
        }
    }
}
公共类节点分配器{
//包含对节点的引用的映射
私有映射节点引用映射;
/**
*解析文件并创建密钥/节点数组对
*@param输入文件
*@返回
*@抛出异常
*/
公共映射parseNodes(字符串输入文件)引发IOException{
//如果重复使用同一对象,则重置列表
noderereferencemap=newhashmap();
//读取文件
FileInputStream fstream=新的FileInputStream(inputFile);
BufferedReader br=新的BufferedReader(新的InputStreamReader(fstream));
弦斯特林;
//将节点解析为引用映射
而((strLine=br.readLine())!=null){
//从节点分割关键点
String[]tokens=strLine.split(“:”);
String key=tokens[0]。trim();
String[]nodes=tokens[1].trim().split(“”);
//将节点设置为键的数组列表
nodeReferenceMap.put(key,Arrays.asList(nodes));
}
//递归构建节点映射
Map parsedNodeMap=newhashmap();
对于(Map.Entry:nodeReferenceMap.entrySet()){
String key=entry.getKey();
列表节点=entry.getValue();
//创建初始节点集
Set start=newhashset();
parsedNodeMap.put(键,开始);
//启动递归调用
addNode(开始,节点);
}
//排序键
List sortedKeys=newarraylist(parsedNodeMap.keySet());
收集。分类(分类键);
//排序节点
Map sortedParsedNodeMap=新建LinkedHashMap();
用于(字符串键:sortedKeys){
List sortedNodes=newarraylist(parsedNodeMap.get(key));
集合。排序(分类节点);
sortedParsedNodeMap.put(键,sortedNodes);
}
//返回已排序的键/节点映射
返回分类ParsedNodeMap;
}
/**
*通过引用先前生成的列表映射递归地添加节点
*@param
*@param节点
*/
私有void addNode(设置起始点,列出节点){
//将每个节点添加到集合映射
用于(字符串节点:节点){
添加(节点);
//获取引用节点
List nodeList=nodeReferenceMap.get(节点);
if(节点列表!=null){
//从抽象列表创建数组列表以删除支持
List referencedNodes=new ArrayList(节点列表);
//删除已搜索的节点以防止无限递归
referencedNodes.removeAll(开始);
//递归搜索更多节点路径
如果(!referencedNodes.isEmpty()){
addNode(开始,referencedNodes);
}
}
}
}
}
然后,您可以从您的程序中调用它,如下所示:

    public static void main(String[] args) {
        try {
            NodeParser nodeParser = new NodeParser();
            Map<String, List<String>> nodeSet = nodeParser.parseNodes("./res/input.txt");
            for(Map.Entry<String, List<String>> entry : nodeSet.entrySet()) {
                String key = entry.getKey();
                List<String> nodes = entry.getValue();
                System.out.println(key + ": " + nodes);
            }
        } catch (IOException e){
            System.err.println("Error: " + e.getMessage());
        }
    }
publicstaticvoidmain(字符串[]args){
试一试{
NodeParser NodeParser=新的NodeParser();
Map nodeSet=nodeParser.parseNodes(“./res/input.txt”);
对于(Map.Entry:nodeSet.entrySet()){
String key=entry.getKey();
列表节点=entry.getValue();
System.out.println(键+“:”+节点);
}
}捕获(IOE异常){
System.err.println(“错误:+e.getMessage());
}
}

此外,输出没有排序,但这应该很简单。

你能用python描述一下你的算法吗?这是家庭作业吗?在我看来,它就像DB理论:>。你不能使用
String.split()
方法吗?为什么不试试Groovy呢?是的,这是家庭作业。索塔。与霍比有关。是的,我似乎再也不知道它的算法了。我需要一些时间来消化这些东西。哈哈。。不,只是想学编程。看起来很复杂,给你。我添加了排序并修复了一个无限递归错误。祝你好运
    public static void main(String[] args) {
        try {
            NodeParser nodeParser = new NodeParser();
            Map<String, List<String>> nodeSet = nodeParser.parseNodes("./res/input.txt");
            for(Map.Entry<String, List<String>> entry : nodeSet.entrySet()) {
                String key = entry.getKey();
                List<String> nodes = entry.getValue();
                System.out.println(key + ": " + nodes);
            }
        } catch (IOException e){
            System.err.println("Error: " + e.getMessage());
        }
    }