将<e>转换为String []会使元素的顺序错误

时间:2016-03-14 16:46:26

标签: java

我是简单的POJO类

public class Option {
    String optionText;

    public String getOptionText() {
        return optionText;
    }

    public void setOptionText(String optionText) {
        this.optionText = optionText;
    }

    @Override
    public String toString() {
        return optionText;
    }

}

在那里我正在创建一个Set对象并希望将该对象转换为String [],我的逻辑是

public class Main {
    Set<Option> options = new HashSet<Option>();
    public Main() {
        Option option1 = new Option();
        option1.setOptionText("Option 1");      
        options.add(option1);
        Option option2 = new Option();
        option2.setOptionText("Option 2");      
        options.add(option2);
        Option option3 = new Option();
        option3.setOptionText("Option 3");      
        options.add(option3);
        Option option4 = new Option();
        option4.setOptionText("Option 4");      
        options.add(option4);

        System.out.println("Set<Option> size is " + options.size());


        System.out.println(getCorrectAnswer(options, "a"));
    }

    public static void main(String[] args) {
        new Main();
    }


    public String getCorrectAnswer(Set<Option> options, String selectedOptionAsCorrect) {
        String answerString = null;
        String[] listOfOptions = new String[4];
        int i = 0;
        for (Option option : options) {
            listOfOptions[i] = option.getOptionText();
            System.out.println("At index " + i + " is " + option.getOptionText());
            i++;
        }
        if(selectedOptionAsCorrect.equals("a")){
            answerString = listOfOptions[0];
        }
        else if(selectedOptionAsCorrect.equals("b")){
            answerString = listOfOptions[1];
        }
        else if(selectedOptionAsCorrect.equals("c")){
            answerString = listOfOptions[2];
        }
        else if(selectedOptionAsCorrect.equals("d")){
            answerString = listOfOptions[3];
        }

        System.out.println("Answer is " + answerString);

        return answerString;        

    }

}

此时我想把它作为

放在控制台上
Set<Option> size is 4
At index 0 is Option 1
At index 1 is Option 2
At index 2 is Option 3
At index 3 is Option 4
Answer is Option 1
Option 1

表示我正在按顺序添加Option 1Option 2Option 3Option 4我希望将这些字符串以与

listOfOptions[0]应该是contian Option 1 listOfOptions[1]应该是Option 2 listOfOptions[2]应该是Option 3 listOfOptions[3]应该是Option 4

但我的输出为

Set<Option> size is 4
At index 0 is Option 3
At index 1 is Option 1
At index 2 is Option 2
At index 3 is Option 4
Answer is Option 3
Option 3

我想问为什么 listOfOptions[0]做contian Option 3
应该包含Option 1,如何解决这个问题是没有任何解决方案或幕后的逻辑是什么,任何人都可以解释。 吨

ton 提前致谢

3 个答案:

答案 0 :(得分:7)

如果您希望获得与添加元素相同的顺序,请使用LinkedHashSet<>实施代替HashSet<> / TreeSet<>

Set<Option> options = new LinkedHashSet<>();
...
options.stream().forEach(System.out::println);
// prints all elements in the order which you'll expect

Oracle Tutorials了解详情。我和Willy du Preez一起建议您查看lists。在你的情况下,他们可能有一个存在的地方。

答案 1 :(得分:4)

请参阅Javadoc of HashSet

  

它不能保证集合

的迭代顺序

如果您希望迭代顺序为广告订单,则可以改为使用LinkedHashSet

  

此链接列表定义迭代排序,即元素插入集合的顺序(插入顺序)

答案 2 :(得分:4)

来自HashSet JavaDoc

  

此类实现Set接口,由哈希表(实际上是HashMap实例)支持。它不能保证集合的迭代顺序;特别是,它不保证订单会随着时间的推移保持不变。

您可以使用List而不是Set,因为看起来您希望它是有序序列。列表JavaDoc

  

有序集合(也称为序列)。该接口的用户可以精确控制列表中每个元素的插入位置。用户可以通过整数索引(列表中的位置)访问元素,并搜索列表中的元素。

您可以使用ArrayList作为实现。