如何根据另一个ArrayList的排序结果调整单词ArrayList的顺序
解决两个列表同步按词频排序的问题
Collections工具类没有直接的方法可以同步排序两个独立的ArrayList,因为两个列表是完全独立的,排序其中一个不会自动关联另一个的索引。下面是两种可行的解决方式:
方案一:封装数据为对象(推荐)
把单词和对应的词频封装成一个自定义类,然后对这个类的列表排序,这是最符合面向对象设计的方式,也能从根源上避免索引同步出错的问题。
步骤1:定义数据类
class WordFrequency { private String word; private int frequency; public WordFrequency(String word, int frequency) { this.word = word; this.frequency = frequency; } // 提供getter方法用于排序和提取数据 public String getWord() { return word; } public int getFrequency() { return frequency; } }
步骤2:创建列表并排序
// 初始化包含单词和词频的对象列表 List<WordFrequency> wordFreqList = new ArrayList<>(); wordFreqList.add(new WordFrequency("the", 1)); wordFreqList.add(new WordFrequency("I", 10)); wordFreqList.add(new WordFrequency("false", 5)); wordFreqList.add(new WordFrequency("too", 7)); // 按词频降序排序 Collections.sort(wordFreqList, (a, b) -> Integer.compare(b.getFrequency(), a.getFrequency())); // 提取排序后的单词和词频 List<String> sortedWords = new ArrayList<>(); List<Integer> sortedFrequencies = new ArrayList<>(); for (WordFrequency wf : wordFreqList) { sortedWords.add(wf.getWord()); sortedFrequencies.add(wf.getFrequency()); } // 输出结果 System.out.println(sortedWords); // 输出: [I, too, false, the] System.out.println(sortedFrequencies); // 输出: [10, 7, 5, 1]
方案二:通过索引列表间接排序(不推荐)
如果一定要保留两个独立的列表,可以先创建索引列表,按词频排序索引,再根据排序后的索引重新构建单词和词频列表:
ArrayList<String> words = new ArrayList<>(Arrays.asList("the", "I", "false","too")); ArrayList<Integer> frequency = new ArrayList<>(Arrays.asList(1, 10, 5, 7)); // 创建索引列表 List<Integer> indices = new ArrayList<>(); for (int i = 0; i < frequency.size(); i++) { indices.add(i); } // 按词频降序排序索引 Collections.sort(indices, (a, b) -> Integer.compare(frequency.get(b), frequency.get(a))); // 根据排序后的索引重新构建列表 List<String> sortedWords = new ArrayList<>(); List<Integer> sortedFrequencies = new ArrayList<>(); for (int idx : indices) { sortedWords.add(words.get(idx)); sortedFrequencies.add(frequency.get(idx)); } // 输出结果 System.out.println(sortedWords); // 输出: [I, too, false, the] System.out.println(sortedFrequencies); // 输出: [10, 7, 5, 1]
注意:方案二需要手动维护索引关系,当列表元素增删时容易出错,因此更推荐方案一。
内容的提问来源于stack exchange,提问作者user18193463
相关产品推荐
相关产品推荐

