HashMaps的Resort ArrayList的简单方法

时间:2018-07-02 17:53:35

标签: java android sorting arraylist hashmap

我的应用程序包含HashMaps的ArrayList。提取的数据按距离排序。为了减少查询,我想求助于ArrayList。我进行了搜索,仅找到建议创建自己的比较器的方法。有更简单的方法吗?就像要按值而不是按距离重新排列HashMaps并将其保存到HashMaps的第二个ArrayList中一样?

我的代码:

games = ['tlou', 'hitman', 'rainbow 6', 'nba2k']
print(games)
def list_o_matic(inp):
    if inp == "":
        games.pop()
        return "the game" + inp + "was deleted"
    elif inp in games:
        games.remove(inp)
        return "the game" + inp + "was removed"
    elif inp != games:
        games.append(inp)
        return "the game" + inp + "was added"
while True:
    if not games:
        print("goodbye!")
        break
    else:
        inp = input("write the name of the game: ")
        if inp == 'quit':
            print("goodbye!")
            break
        else:
            list_o_matic(inp)
            print(games)

2 个答案:

答案 0 :(得分:1)

与使用HashMaps相比,可能使事情更简单的一种替代方法是为Contact创建一个类,而不是说:

public class Contact {

    private String id;
    private Double dist;
    private String value;

    public Contact(String id, Double dist, String value) {
        this.id = id;
        this.dist = dist;
        this.value = value;
    }

    // Omitting the setters for brevity 

    public String getId() {
        return this.id;
    }

    public Double getDist() {
        return this.dist;
    }

    public String getValue() {
        return this.value;
    }
}

然后在您的代码中使用ArrayList中的Contacts

    List<Contact> contactList;

    // ... rest of the code

    @Override
    protected Void doInBackground(Void... arg0) {
        HttpHandler sh = new HttpHandler();

        String jsonStr = sh.makeServiceCall(url);

        Log.e(TAG, "Response from url: " + jsonStr);

        if (jsonStr != null) {
            try {
                JSONObject jsonObj = new JSONObject(jsonStr);

                JSONArray contacts = jsonObj.getJSONArray("stores");

                for (int i = 0; i < contacts.length(); i++) {
                    JSONObject c = contacts.getJSONObject(i);

                    String id = c.getString("id");
                    Double dist = c.getDouble("dist"); // assuming dist is double
                    String value = c.getString("value");

                    contactList.add(new Contact(id, dist, value));
                }
            }
        }
    }

然后对集合进行排序:

contactList.sort(comparing(Contact::getDist));

答案 1 :(得分:1)

  

我想求助于ArrayList。我进行了搜索,仅找到建议创建自己的比较器的方法。有更简单的方法吗?

要清楚一点,您看到的建议肯定是写了Comparator 以便能够使用Collections.sort()进行实际排序

仅实现一种用于比较列表中两个元素的机制比编写整个排序例程要简单得多(这仍然需要知道如何比较元素)。您还可以选择使用实现HashMap的{​​{1}}的自定义子类,但是要比合适的Comparable需要确保将元素添加到列表中的任何地方都被实际使用。

现在,从头开始编写Comparator实现并不难,但是如今,您可能不必这样做了。 Comparator接口现在具有一些用于构建实例的静态方法。因此,出于您的目的,您可能会做些简单的事情:

Comparator

请注意,您确实在这里构建并使用Collections.sort(contactList, Comparator.comparing(m -> Integer.valueOf(m.get("dist")))); instance ,但是您不必编写其类。我认为您没有比这更简单的希望了。