我有以下代码:
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,任何人都可以解释它为什么会发生,即使代码在同一个线程中运行?我怎么能避免它呢?
如果我们这样写,就会出现并发修改异常:
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(或任何类似的语言)中,如何编写从列表中删除元素的纯函数(或方法)。
如果该元素在列表中,我们只需返回一个新的(理想情况下不可变的)列表,其中包含输入列表的所有元素,减去我们删除的元素。
但是如果在列表中找不到该元素,您将如何处理?
假设该方法接收 2 个参数,即list和element要删除的参数:
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:
Optional.of(listCopy)(编辑:发布后添加到我的问题中)我应该提到,我只想删除第一次出现的element,因此如果输入list多次出现element,我不想通过对我的remove() 方法的一次调用来删除它们(例如使用stream().filter())来删除它们。我刚刚编辑了代码示例中的注释来反映这一点。然而,这与我的问题并不完全相关,因为我的主要问题围绕如何使该方法直观易用并保持“纯粹”。
我在上述建议的基础上添加了一个额外的想法。返回Optional.of(listCopy)似乎是迄今为止所提出的解决方案中最优雅的解决方案。它强制调用者检查请求的操作是否成功,并且(如果成功),它返回一个新列表,从而不会修改原始输入列表。如果操作不成功(element …
我想从我的 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)