集合排序以对两个ArrayLists排序

时间:2016-11-15 18:40:49

标签: java sorting arraylist collections

我的程序必须使用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);
            }
        }
    }    
}

3 个答案:

答案 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”的要求。