【问题标题】:Java - printing values of HashSetJava - 打印 HashSet 的值
【发布时间】:2021-09-09 14:55:47
【问题描述】:

我在这里有一个简单的程序,旨在找到一组字母或一组单词的所有排列。从我所看到的程序确实可以找到排列的数量,但是它只会打印空白行来代替可能的排列应该在的位置。 (注意,UI.println() 在打印轮廓时适用于所有其他情况,但由于某种原因在这里不起作用:()

我在这里包含了我的方法,它应该按照我的描述进行,以及一个应该能够打印出排列的方法。

有人对我在这里做错了什么有任何想法吗?


public class Permutations {

    public List<List<String>> findPermutations(Set<String> items){

        Set<String> copyOfItems = new HashSet<String>(items);   // a copy of the set of items that can be modified
        List<List<String>> ans = new ArrayList<List<String>>(); // where we will collect the answer
        counter=0;
        //suggested approach:
        extendPermutation(copyOfItems, new Stack<String>(), ans);   

        return ans;
    }

   
    public void extendPermutation(Set<String> remainingItems, Stack<String> permutationSoFar, List<List<String>> allPermutations){
        /*# YOUR CODE HERE */
        Set<String> alternateSet = new HashSet<String>(remainingItems);
        if (remainingItems.isEmpty()) {
            allPermutations.add(permutationSoFar);
            this.counter = counter + 1;
        } 
        for (String str : remainingItems) {
            alternateSet.remove(str);
            permutationSoFar.push(str);
            extendPermutation(alternateSet,permutationSoFar,allPermutations);
            permutationSoFar.pop();
        }
    
        

    }

  
    public void setupGUI(){
        UI.addButton("A B C D E", ()->{printAll(findPermutations(Set.of("A","B","C","D","E")));});
        UI.addTextField("Letters", (String v)->{printAll(findPermutations(makeSetOfLetters(v)));});
        UI.addTextField("Words", (String v)->{printAll(findPermutations(makeSetOfWords(v)));});
        UI.addButton("Quit", UI::quit);
        UI.setDivider(1.0);
    }

    public void printAll(List<List<String>> permutations){
        UI.clearText();
        for (int i=0; i<permutations.size(); i++){
            for (String str : permutations.get(i)){UI.print(str+" ");}
            UI.println();
        }
        UI.println("----------------------");
        UI.printf("%d items:\n", permutations.get(0).size());
        UI.printf("%,d permutations:\n", counter);
        UI.println("----------------------");
    }

   
    public Set<String> makeSetOfLetters(String str){
        Set<String> ans = new HashSet<String>();
        for (int i=0; i<str.length(); i++){
            if (str.charAt(i)!=' '){
                ans.add(""+str.charAt(i));
            }
        }
        return Collections.unmodifiableSet(ans);
    }

   
    public Set<String> makeSetOfWords(String str){
        Set<String> ans = new HashSet<String>();
        for (String v : str.split(" ")){ans.add(v);}
        return Collections.unmodifiableSet(ans);
    }

    // Counter for the number of complete permutations found
    private long counter = 0;  

    
    public void reportCounter(){
        if ((counter<<54)==0) {UI.printMessage((counter>10000000)?((counter>>>20)+"M"):((counter>>>10)+"K"));}
    }

    // Main
    public static void main(String[] arguments) {
        Permutations p = new Permutations();
        p.setupGUI();
    }
}

【问题讨论】:

  • 这段代码甚至无法编译。可能您看到的是旧编译的结果。尝试发布所有代码。
  • 已编辑以包含所有代码,我想我只会包含相关部分!希望这会更有帮助

标签: java hashset


【解决方案1】:

你的代码

permutationSoFar.push(str);
extendPermutation(alternateSet, permutationSoFar, allPermutations);
permutationSoFar.pop();

您首先向 permutationSoFar 添加一个项目, 然后你将 permutationSoFar 添加到你的 allPermutations 中,只是为了弹出 permutationSoFar。确保您的 permutationSoFar 从不包含任何元素。

当您打印 permutationSoFars 列表时,即 allPermutations,您将打印一个空列表列表。

看看你的问题,这可能会解决问题:

allPermutations.add(List.copyOf(permutationSoFar));

但是,坦率地说,它就像您的其他代码一样,不是最干净的解决方案。

【讨论】:

    猜你喜欢
    • 2020-10-25
    • 1970-01-01
    • 2021-07-16
    • 2011-01-31
    • 1970-01-01
    • 2015-02-14
    • 1970-01-01
    • 2023-03-28
    • 1970-01-01
    相关资源
    最近更新 更多