相关疑难解决方法(0)

ArrayList的ConcurrentModificationException

我有以下代码:

private String toString(List<DrugStrength> aDrugStrengthList) {
    StringBuilder str = new StringBuilder();
        for (DrugStrength aDrugStrength : aDrugStrengthList) {
            if (!aDrugStrength.isValidDrugDescription()) {
                aDrugStrengthList.remove(aDrugStrength);
            }
        }
        str.append(aDrugStrengthList);
        if (str.indexOf("]") != -1) {
            str.insert(str.lastIndexOf("]"), "\n          " );
        }
    return str.toString();
}
Run Code Online (Sandbox Code Playgroud)

当我尝试运行它时,我得到ConcurrentModificationException,任何人都可以解释它为什么会发生,即使代码在同一个线程中运行?我怎么能避免它呢?

java collections concurrency

79
推荐指数
5
解决办法
11万
查看次数

奇怪的Java并发修改异常示例

如果我们这样写,就会出现并发修改异常:

public static void main(String... args) {
    List<String> listOfBooks = new ArrayList<>();
    listOfBooks.add("Programming Pearls");
    listOfBooks.add("Clean Code");
    listOfBooks.add("Effective Java");
    listOfBooks.add("Code Complete");

    System.err.println("Before deleting : " + listOfBooks);
    for (String book : listOfBooks) {
        if (book.contains("Code")) {
            listOfBooks.remove(book);
        }
    }
    System.err.println("After deleting : " + listOfBooks);
}
Run Code Online (Sandbox Code Playgroud)

另一方面,如果我们这样写,没有并发修改异常! 请注意,代码完全相同,除了用于比较的字符串,在第一个示例中它是一个代码,在第二个示例中它是一个Java

public static void main(String... args) {
    List<String> listOfBooks = new ArrayList<>();
    listOfBooks.add("Programming Pearls");
    listOfBooks.add("Clean Code");
    listOfBooks.add("Effective Java");
    listOfBooks.add("Code Complete");

    System.err.println("Before deleting : " + listOfBooks);
    for (String book : …
Run Code Online (Sandbox Code Playgroud)

java exception

8
推荐指数
2
解决办法
405
查看次数

您将如何编写一个从列表中删除元素的“纯”函数?

在 Java(或任何类似的语言)中,如何编写从列表中删除元素的纯函数(或方法)。

如果该元素在列表中,我们只需返回一个新的(理想情况下不可变的)列表,其中包含输入列表的所有元素,减去我们删除的元素。

但是如果在列表中找不到该元素,您将如何处理?

假设该方法接收 2 个参数,即listelement要删除的参数:

public SOMETHING remove(final List<String> list, final String element){
    // Copy the input list and remove the first occurrence of 'element', if I find it.
    // 
    // if I don't find it ... do something clever here ...
}
Run Code Online (Sandbox Code Playgroud)

如果我调用这个方法,并且element不包含在里面list

  • 抛出异常可能会使方法“不纯”(?)
  • 修改输入列表并返回布尔值(类似于List#remove())可能会使方法“不纯”(修改输入将是副作用)
  • 如果我调用此方法,将输入作为输出返回对我来说似乎不直观。
  • 返回Optional.of(listCopy)(编辑:发布后添加到我的问题中)
  • 还有其他想法吗?

编辑

我应该提到,我只想删除第一次出现的element,因此如果输入list多次出现element,我不想通过对我的remove() 方法的一次调用来删除它们(例如使用stream().filter())来删除它们。我刚刚编辑了代码示例中的注释来反映这一点。然而,这与我的问题并不完全相关,因为我的主要问题围绕如何使该方法直观易用并保持“纯粹”。

编辑2

我在上述建议的基础上添加了一个额外的想法。返回Optional.of(listCopy)似乎是迄今为止所提出的解决方案中最优雅的解决方案。它强制调用者检查请求的操作是否成功,并且(如果成功),它返回一个新列表,从而不会修改原始输入列表。如果操作不成功(element …

java functional-programming pure-function

3
推荐指数
1
解决办法
1081
查看次数

如何从java中的json字符串(带子项)中删除特定键名的所有键及其值

我想从我的 json 字符串中删除所有键“id”及其值。问题是“id”在我的 json 字符串中有很多级别。我正在使用 JSONObject。使用 JSONObject 我们只能在顶级删除“id”,但我需要从每个级别删除“id”。请帮我

json字符串的Ex -

"{
    "success": {
        "body": {
            "id": 5827,
            "siteName": "RPX",
            "instances": [
                {
                    "instanceId": "i-3a63035e",
                    "name": "prdae-mst21a (iserver)",
                    "state": "running",
                    "publicDnsName": "ec2-54-209-175-118.compute-1.amazonaws.com",
                    "tags": [

                        {
                            "id": 9783,
                            "key": "ktier",
                            "value": "da"
                        },
                        {
                            "id": 9782,
                            "key": "Name",
                            "value": "prdae-mst21a (iserver)"
                        },
                        {
                            "id": 9781,
                            "key": "kreg",
                            "value": "e"
                        }
                    ],
                    "sshAccessInfo": {
                        "id": 9788,
                        "keyPair": {
                            "id": 6050,
                            "keyName": "Kens key",
                            "status": "UPLOADED",
                            "defaultUser": "root",
                            "passPhrase": "imaginea#@!"
                        },
                        "userName": "imaginea"
                    }, …
Run Code Online (Sandbox Code Playgroud)

java string json

1
推荐指数
1
解决办法
6354
查看次数