我的程序必须使用Collections排序方法按字典顺序对字符串的ArrayList进行排序,但每个String都有一个存储在单独的ArrayList中的相应整数值。我想对它们进行相同的排序,以便整数值保持正确的字符串。如果你知道一个更好的方法来存储这两个价值观,那我就是全部。
public class a5p1b {
public static void main(String[] args) {
Scanner input = new Scanner(System.in).useDelimiter("[^a-zA-z]+");
// ArrayLists to store the Strings and the frequencies
ArrayList<String> lst = new ArrayList<String>();
ArrayList<Integer> intLst = new ArrayList<Integer>();
//loops through as long as there is user input
while (input.hasNext()) {
String str = input.next().toLowerCase();
// if the list already has the string it doesn't add it and it
// ups the count by 1
if (lst.contains(str)) {
int index = lst.indexOf(str);
intLst.set(index, intLst.get(index) + 1);
} else {
// if the word hasnt been found yet it adds it to the list
lst.add(str);
intLst.add(1);
}
}
}
}
答案 0 :(得分:5)
你的抽象错误。如果该字符串和该数字属于一起,那么不将它们保存在两个不同的列表中。
而是创建一个类(或者可以使用现有的Pair类之一)来保存这两个值。然后,您可以为该类提供equals方法;加上一个特定的comparator,只比较字符串元素。
最后,您将该类的对象放入单个列表中;然后你排序那个列表。
良好的面向对象编程的整个想法是创建有用的抽象!
记录:正如dnault建议的那样,如果字符串和数字之间确实没有“紧密”耦合,你也可以使用TreeMap(用作TreeMap<String, Integer>
)来处理排序带有数字的字符串。
答案 1 :(得分:0)
尝试
inList.sort(Comparator.comparing(i -> i.toString());
虽然,我认为这两个名单并不是一个好主意。
答案 2 :(得分:0)
您应该使用Map将每个唯一的String键与Integer值相关联。
然后,您可以在keySet()
返回的地图的密钥集上调用Collections.sort。
此外,如果使用TreeMap等SortedMap,则无需对键进行排序。但是,该解决方案可能无法满足您的“作业5问题1b”的要求。