【问题标题】:Bubble Sorting Java Strings stored in JSONArray对存储在 JSONArray 中的 Java 字符串进行冒泡排序
【发布时间】:2014-08-05 00:22:18
【问题描述】:

我在磁盘上保存了一个 JSON 文件,如下所示:

{
  "author": [
    "Mario Vargas Llosa",
    "Maria Duenas",
    "Liviu Rebreanu",
    "Liviu Rebreanu"
  ],
  "nameBook": [
    "Eroul discret",
    "Iubirile croitoresei",
    "Ion",
    "Ion"
  ],
  "priceBook": [
    34,
    28,
    40,
    40
  ],
  "publisherBook": [
    "Humanitas",
    "Polirom",
    "Humanitas",
    "Dacia"
  ],
  "idBook": [
    1,
    2,
    3,
    4
  ]
}

然后我有以下Java代码:

// read the json file
FileReader reader = new FileReader(filePath);

JSONParser jsonParser = new JSONParser();
JSONObject jsonObject = (JSONObject) jsonParser.parse(reader);

// get a String from the JSON object

JSONArray idBookJ =  (JSONArray) jsonObject.get("idBook");
JSONArray nameBookJ = (JSONArray) jsonObject.get("nameBook");
JSONArray authorJ = (JSONArray) jsonObject.get("author");
JSONArray publisherBookJ = (JSONArray) jsonObject.get("publisherBook");
JSONArray priceBookJ = (JSONArray) jsonObject.get("priceBook");

现在我需要使用冒泡排序对publisherBook 标记中的内容按字母顺序排序,在单词的第一个字母之后。我知道这不是最令人惊奇的编程挑战,但我被困在将 JSONArray 中的字符串视为...字符串。

【问题讨论】:

  • 您想按照什么标准进行排序?那应该比较什么来确定排序顺序?
  • 条件应该是单词的第一个字母。
  • 什么词?作者、出版商、价格、ID 或(书)名称?此外,您可能应该将书籍属性的集合转换为 Java Book 对象(因为您将每个属性都放在单独的 JSON 数组中)。
  • 如前所述,仅适用于“publisherBook”。抱歉,英语不是我的母语。
  • 确实,这是我的问题:如何将其转换为可用的 Java 表单?

标签: java json sorting bubble-sort


【解决方案1】:

这个solution 为我工作,但我仍会发布代码以防万一。它不是纯粹的冒泡排序,但总比没有好。

JSON 数组:

[
   {
      "firstName":"John",
      "lastName":"Doe"
   },
   {
      "firstName":"Anna",
      "lastName":"Smith"
   },
   {
      "firstName":"Peter",
      "lastName":"Jones"
   }
]

JSON Simple 库可用here:

package com.iglooworks.test;
    import org.json.simple.JSONArray;
    import org.json.simple.JSONObject;

    import java.util.Set;
    import java.util.SortedMap;
    import java.util.TreeMap;

    public class JsonSorter {
        public static JSONArray sortJsonByKey(JSONArray json, String key)
        {
            JSONArray sorted = new JSONArray();
            SortedMap map = new TreeMap();

            for (Object o : json) {
                JSONObject tmp = (JSONObject) o;
                map.put(tmp.get(key),tmp);
            }

            Set<String> numbers = map.keySet();

            for (String number : numbers) {
                sorted.add(map.get(number));
            }

            return sorted;
        }

}

用法好像很简单:

package com.iglooworks.test;

import com.iglooworks.tools.JsonSorter;
import org.json.simple.*;

public class Test {
    public static void main(String[] args) {
                String json = "[\n" +
                "   {\n" +
                "      \"firstName\":\"John\",\n" +
                "      \"lastName\":\"Doe\"\n" +
                "   },\n" +
                "   {\n" +
                "      \"firstName\":\"Anna\",\n" +
                "      \"lastName\":\"Smith\"\n" +
                "   },\n" +
                "   {\n" +
                "      \"firstName\":\"Peter\",\n" +
                "      \"lastName\":\"Jones\"\n" +
                "   }\n" +
                "]";

        JSONArray jsonArray;
        try {
            jsonArray = tools.sortJsonByKey((JSONArray) JSONValue.parse(json), "firstName");


            for (Object o : jsonArray) {
                JSONObject tmp = (JSONObject) o;
                System.out.println(tmp.get("firstName") + " - " + tmp.get("lastName"));
            }

        } catch (Exception e) {
            e.printStackTrace(); 
        }


    }
}

最后的想法:我发现这个解决方案可能会导致 NullPointerException,所以我有时间会尝试改进它。

【讨论】:

    【解决方案2】:

    这应该让你开始,

    static class Book {
      public Book() {
    
      }
      int id;
      String name;
      String author;
      String publisher;
      int price;
      public String toString() {
        return "[" + id + " " + name + " " + author + " " + publisher + " " + price + "]";
      }
      public int getId() {
        return id;
      }
      public void setId(int id) {
        this.id = id;
      }
      public String getName() {
        return name;
      }
      public void setName(String name) {
        this.name = name;
      }
      public String getAuthor() {
        return author;
      }
      public void setAuthor(String author) {
        this.author = author;
      }
      public String getPublisher() {
        return publisher;
      }
      public void setPublisher(String publisher) {
        this.publisher = publisher;
      }
      public int getPrice() {
        return price;
      }
      public void setPrice(int price) {
        this.price = price;
      } 
    }
    
    public static void main(String[] args) {
      // read the json file
      FileReader reader = new FileReader(filePath);
    
      JSONParser jsonParser = new JSONParser();
      JSONObject jsonObject = (JSONObject) jsonParser.parse(reader);
    
      // get a String from the JSON object
    
      JSONArray idBookJ =  (JSONArray) jsonObject.get("idBook");
      JSONArray nameBookJ = (JSONArray) jsonObject.get("nameBook");
      JSONArray authorJ = (JSONArray) jsonObject.get("author");
      JSONArray publisherBookJ = (JSONArray) jsonObject.get("publisherBook");
      JSONArray priceBookJ = (JSONArray) jsonObject.get("priceBook");
      Book[] books = new Book[idBookJ.size()]; 
      for (int i = 0; i < idBookJ.size(); i++) {
        books[i] = new Book();
        books[i].setId(idBookJ.getInt(i));
        books[i].setName(nameBookJ.getString(i));
        books[i].setAuthor(authorJ.getString(i));
        books[i].setPublisher(publisherBookJ.getString(i));
        books[i].setPrice(priceBookJ.getInt(i));
      }
      Comparator<Book> publisherComparator = new Comparator<Book>() {
        @Override
        public int compare(Book o1, Book o2) {
          return o1.getPublisher().compareTo(o2.getPublisher());
        }
      };
      // Now your Books are in the book[], and you have a Comparator that can compare them by
      // publisher.
    }
    

    【讨论】:

    • 我认为应该编辑答案,length() 方法不存在。相反,您可以使用size()。感谢您的简短开始。
    • @GeorgeNetu 已编辑。我写给 Doug Crockford 的 JSON-java library,下次请说明你使用的是哪个库。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-04-21
    • 2017-04-14
    • 1970-01-01
    • 2018-09-22
    • 2015-04-17
    • 2016-02-09
    • 2014-05-08
    相关资源
    最近更新 更多