“最合适”;2D";在Java中并排存储字符串和双值的表示法?

“最合适”;2D";在Java中并排存储字符串和双值的表示法?,java,arrays,arraylist,containers,Java,Arrays,Arraylist,Containers,我正在寻找一种既能存储字符串又能存储双精度数据的数据类型,以便保存记录。字符串是某个密码,double是该密码的某个分数,在将密码插入数据结构后确定。哪种数据类型最适合这种情况 到目前为止,我一直在使用ArrayLists,每一位数据对应一个,但现在我需要实现按一个部分进行排序,而物流对我来说并不是特别有吸引力 例如: private ArrayList key=ArrayList(); 私有ArrayList分数=ArrayList(); //n和m在运行时确定 专用无效生成键(int m,i

我正在寻找一种既能存储字符串又能存储双精度数据的数据类型,以便保存记录。字符串是某个密码,double是该密码的某个分数,在将密码插入数据结构后确定。哪种数据类型最适合这种情况

到目前为止,我一直在使用
ArrayList
s,每一位数据对应一个,但现在我需要实现按一个部分进行排序,而物流对我来说并不是特别有吸引力

例如:

private ArrayList key=ArrayList();
私有ArrayList分数=ArrayList();
//n和m在运行时确定
专用无效生成键(int m,int n){
for(int i=0;i
示例数据如下:

    key     score
"fsuifshu", 0.950
"wowaflsa", 0.120
"woawfjff", 0.430
"fireplfd", 0.040
...
"fsuifshu"
"woawfjff"
"wowaflsa"
"fireplfd"
首先使用循环和随机字符生成器插入
,然后在插入每个
后计算
分数
。我确实希望能够移动它们(根据
分数排序)

最终,我希望能够根据它们的分数对键进行排序。因此,基于上述内容的预期产出为:

    key     score
"fsuifshu", 0.950
"wowaflsa", 0.120
"woawfjff", 0.430
"fireplfd", 0.040
...
"fsuifshu"
"woawfjff"
"wowaflsa"
"fireplfd"

例如,排序后的ArrayList将包含该元素。

您希望使用java.util.Map。它存储键值对

Map Map=newhashmap();
地图放置(“foo”,1.0D);

您想使用java.util.Map。它存储键值对

Map Map=newhashmap();
地图放置(“foo”,1.0D);

我强烈不同意Jason的回答,出于以下几个原因,我不会将数据放入地图中:

  • 我认为您应该避免使用映射作为表示域数据的惰性方式。我发现创建自己的域类来保存域数据要好得多。您可以更好地使用定义良好的对象,例如轻松地将其放入其他数据结构或将其作为参数传递给函数,同时对数据非常清楚

  • 如果将来您需要关于密码的附加元数据,那么映射数据结构将中断,需要大量返工,而对于域类,您可以只添加另一个字段,而无需更改任何其他内容

  • 通常,地图不打算作为排序数据结构。有一些映射结构可以保持插入顺序或对键进行排序,但对值进行排序尤其奇怪。您可以强制数据按照您想要的任何方式进行排序(如图所示),但我会避免尝试将horn结构转换为它们不适用的内容

  • 下面是我将要做的一个例子:

    import java.util.ArrayList;
    import java.util.Comparator;
    import java.util.List;
    import java.util.Random;
    
    public class Main {
        public static void main(String[] args) {
            List<PasswordWithScore> passwords = new ArrayList<>();
    
            int numberOfPasswords = 5;
            int lengthOfPassword = 5;
    
            Random rand = new Random();
            String chars = "abcdefghijklmnopqrstuvwxyz";
    
            for (int i = 0; i < numberOfPasswords; i++) {
                StringBuilder password = new StringBuilder();
                for (int j = 0; j < lengthOfPassword; j++) {
                    password.append(chars.charAt(rand.nextInt(chars.length())));
                }
                passwords.add(new PasswordWithScore(password.toString()));
            }
    
            passwords.sort(Comparator.comparing(PasswordWithScore::getScore).reversed());
            System.out.println(passwords);
        }
    }
    

    我强烈不同意Jason的回答,出于以下几个原因,我不会将数据放入地图:

  • 我认为您应该避免使用映射作为表示域数据的惰性方式。我发现创建自己的域类来保存域数据要好得多。您可以更好地使用定义良好的对象,例如轻松地将其放入其他数据结构或将其作为参数传递给函数,同时对数据非常清楚

  • 如果将来您需要关于密码的附加元数据,那么映射数据结构将中断,需要大量返工,而对于域类,您可以只添加另一个字段,而无需更改任何其他内容

  • 通常,地图不打算作为排序数据结构。有一些映射结构可以保持插入顺序或对键进行排序,但对值进行排序尤其奇怪。您可以强制数据按照您想要的任何方式进行排序(如图所示),但我会避免尝试将horn结构转换为它们不适用的内容

  • 下面是我将要做的一个例子:

    import java.util.ArrayList;
    import java.util.Comparator;
    import java.util.List;
    import java.util.Random;
    
    public class Main {
        public static void main(String[] args) {
            List<PasswordWithScore> passwords = new ArrayList<>();
    
            int numberOfPasswords = 5;
            int lengthOfPassword = 5;
    
            Random rand = new Random();
            String chars = "abcdefghijklmnopqrstuvwxyz";
    
            for (int i = 0; i < numberOfPasswords; i++) {
                StringBuilder password = new StringBuilder();
                for (int j = 0; j < lengthOfPassword; j++) {
                    password.append(chars.charAt(rand.nextInt(chars.length())));
                }
                passwords.add(new PasswordWithScore(password.toString()));
            }
    
            passwords.sort(Comparator.comparing(PasswordWithScore::getScore).reversed());
            System.out.println(passwords);
        }
    }
    

    虽然map乍一看似乎很合适,但我建议使用单独的类,因为您计划对数据进行排序

    public class MyDataHolder{
    
         String pass;
         double score;
        // getters & setters
     }
    
    然后可以将对象存储在列表中

    List<MyDataHolder> myEntries;
    
    列出myEntries;
    

    并按及格或分数排序

    虽然map乍一看似乎合适,但我建议使用单独的类,因为您计划对数据进行排序

    public class MyDataHolder{
    
         String pass;
         double score;
        // getters & setters
     }
    
    然后可以将对象存储在列表中

    List<MyDataHolder> myEntries;
    
    列出myEntries;
    

    并按及格或分数排序

    您希望在该数据结构中存储多少条目?你更关心的是内存使用还是优雅?@JörnHorstmann轻松编程。不关心内存或速度。条目数由用户定义,没有最大值。您希望在此数据结构中存储多少条条目?你更关心的是内存使用还是优雅?@JörnHorstmann轻松编程。不关心内存或速度。条目数是用户定义的,没有最大值。我非常同意。建议使用地图的答案不应该被投得太高,因为在我看来,这是一种糟糕的做法,甚至是一个糟糕的解决方案,因为它不容易按照OP的要求进行排序。我非常同意。建议使用地图的答案不应该被投得太高,因为在我看来,这是一种糟糕的做法,甚至是一个糟糕的解决方案,因为它不容易按照OP的要求进行排序。我强烈不同意这个答案。首先,地图并不是真正按照其值排序的;这是可行的,但我相信他们不应该被硬塞进去。OP应该使用一个域类来表示他们的数据,而不是一个不太清晰、不太灵活的映射