如何按数字顺序对字符串和数字列表进行排序?

Posted

技术标签:

【中文标题】如何按数字顺序对字符串和数字列表进行排序?【英文标题】:How do I sort a list of string and numbers in numerical order? 【发布时间】:2021-07-08 09:51:51 【问题描述】:

如何以这样的非正式方式修复 id 的排序:

 1
10
11
..
2
20
21
..

我想打印如下:

1
2
3
..
10
11
..

另外,我的 MainData.getName 包含最多 1000 个 ListArrays 列表的字符串和数字,请参阅我的应用图片链接:

这是我的应用图片:[1]:https://i.stack.imgur.com/woPm0.jpg

我试过了,结果还是一样

int[] range = IntStream.rangeClosed(1, 1000).toArray();
List<String> rangeList = new ArrayList<>();
for (int number : range) 
    rangeList.add(String.valueOf(number));

这是我的 MainActivity

Api api = retrofit.create(Api.class);
    Call<List<MainData>> call = api.getData();
    call.enqueue(new Callback<List<MainData>>() 
        @Override
        public void onResponse (Call<List<MainData>> call, Response<List<MainData>> response) 
            if (!response.isSuccessful()) 
                Toast.makeText(MainActivity.this, response.code(), Toast.LENGTH_SHORT).show();
                return;
            
            List<MainData> postList = response.body();
            // Filter out any items where "name" is blank or null.
            List<MainData> tempList = new ArrayList<>();
            for(MainData data :postList)
            

                if(null!= data.getName() && !data.getName().isEmpty()) 

                     //sort by name
                    Collections.sort(tempList, (mainData, t1) -> mainData.getName().compareTo(t1.getName()));

                    int[] range = IntStream.rangeClosed(1, 1000).toArray();
                    List<String> rangeList = new ArrayList<>();
                    for (int number : range) 
                        rangeList.add(String.valueOf(number));
                    

                    //sort by ListId
                    Collections.sort(tempList, (mainData, t1) -> mainData.getListId().compareTo(t1.getListId()) );

                    tempList.add(data);

                
            

            RecyclerViewAdapter recyclerViewAdapter = new RecyclerViewAdapter(tempList, MainActivity.this);
            recyclerView.setAdapter(recyclerViewAdapter);
        

        @Override
        public void onFailure (Call<List<MainData>> call, Throwable t) 
            Toast.makeText(MainActivity.this, t.getMessage(), Toast.LENGTH_SHORT).show();
        
    );

这是我的 Json 数据

public class MainData 

    public String listId, name, id;

    public String getListId () 
        return listId;
    

    public  String getName () 
        return name;
    

    public  String getId () 
        return id;
    

【问题讨论】:

【参考方案1】:

由于您的 listId 是 String ,因此列表将按字典顺序排序。相反,您可以先将字符串转换为整数,然后对其进行排序。下面是插图。

Collections.sort(tempList, (mainData, t1) -> Integer.parseInt(mainData.getListId())-Integer.parseInt(t1.getListId());

【讨论】:

兄弟名称是一个字符串,但是当我更改代码时,您给我的应用程序名称正在停止并说:java.lang.NumberFormatException:对于输入字符串:“Item 276” 我也按 id 对其进行了排序,它工作正常,但是当我按名称对其进行排序时,它的说法是 ;java.lang.NumberFormatException:对于输入字符串:“Item 276”,要求是按名称 当然,如果您尝试将“Item 276”转换为整数,它会抛出数字格式异常。 整个列表包含这样的数字:带数字的项目我该怎么办。如果我确实尝试并抓住它会忽略整个排序的事情 谢谢这个答案也有效。非常感谢【参考方案2】:
Collections.sort(tempList, (o1, o2) -> 
    // splitting name with respect to white space and setting the integer part in a local variable to compare 
    Integer n1 = Integer.parseInt(o1.getName().split(" ")[1]);
    Integer n2 = Integer.parseInt(o2.getName().split(" ")[1]);
    return n1.compareTo(n2);
);

这应该可以解决您的问题。但是,此代码要求 MainData 对象的名称字段应始终为“Item XXX”格式,其中 XXX 为数字。

【讨论】:

非常感谢它的工作,感谢您的宝贵时间 我如何才能学习所有这些员工兄弟,当我做某事时,我总是卡住

以上是关于如何按数字顺序对字符串和数字列表进行排序?的主要内容,如果未能解决你的问题,请参考以下文章

数组列表排序[重复]

当字符串为数字时,如何在考虑值的同时按字母顺序对字符串进行排序?

当字符串是数字时,如何在考虑值的同时按字母顺序对字符串进行排序?

按字母顺序对字符串列表进行排序 (C)

除数字外,如何按字母顺序对对象数组进行排序?

Python:根据属性对对象列表进行排序