优化ArrayList条件

时间:2017-03-17 06:06:18

标签: java if-statement optimization arraylist

我的数组列表中有一些值,我必须根据条件删除一些特定的值。我使用的是IF条件,但有很多条件要比较,所以我需要优化比较时间。我的清单是

  

Msisdn_array = {45,85,79,60,502}

如果条件匹配,则删除该条目。

以下是条件,是否有任何可能的方法来优化这些条件。

if(Msisdn_array.contains("60") && Msisdn_array.contains("910"))
{
Msisdn_array.remove("60");
Msisdn_array.remove("910");
}

if(Msisdn_array.contains("75") && Msisdn_array.contains("500"))
{
Msisdn_array.remove("75");
Msisdn_array.remove("500");
}

if(Msisdn_array.contains("76") && Msisdn_array.contains("502"))
{
Msisdn_array.remove("76");
Msisdn_array.remove("502");
}

if(Msisdn_array.contains("61") && Msisdn_array.contains("911"))
{
Msisdn_array.remove("61");
Msisdn_array.remove("911");
}

if(Msisdn_array.contains("77") && Msisdn_array.contains("503"))
{
Msisdn_array.remove("77");
Msisdn_array.remove("503");
}

if(Msisdn_array.contains("78") && Msisdn_array.contains("505"))
{
Msisdn_array.remove("78");
Msisdn_array.remove("505");
}

if(Msisdn_array.contains("79") && Msisdn_array.contains("507"))
{
Msisdn_array.remove("79");
Msisdn_array.remove("507");
}

if(Msisdn_array.contains("62") && Msisdn_array.contains("912"))
{
Msisdn_array.remove("62");
Msisdn_array.remove("912");
}

if(Msisdn_array.contains("63") && Msisdn_array.contains("913"))
{
Msisdn_array.remove("63");
Msisdn_array.remove("913");
}

if(Msisdn_array.contains("64") && Msisdn_array.contains("914"))
{
Msisdn_array.remove("64");
Msisdn_array.remove("914");
}

if(Msisdn_array.contains("65") && Msisdn_array.contains("915"))
{
Msisdn_array.remove("65");
Msisdn_array.remove("915");
}

if(Msisdn_array.contains("66") && Msisdn_array.contains("916"))
{
Msisdn_array.remove("66");
Msisdn_array.remove("916");
}

if(Msisdn_array.contains("67") && Msisdn_array.contains("917"))
{
Msisdn_array.remove("67");
Msisdn_array.remove("917");
}

if(Msisdn_array.contains("68") && Msisdn_array.contains("918"))
{
Msisdn_array.remove("68");
Msisdn_array.remove("918");
}

if(Msisdn_array.contains("69") && Msisdn_array.contains("919"))
{
Msisdn_array.remove("69");
Msisdn_array.remove("919");
}

if(Msisdn_array.contains("70") && Msisdn_array.contains("920"))
{
Msisdn_array.remove("70");
Msisdn_array.remove("920");
}

if(Msisdn_array.contains("71") && Msisdn_array.contains("921"))
{
Msisdn_array.remove("71");
Msisdn_array.remove("921");
}

if(Msisdn_array.contains("72") && Msisdn_array.contains("922"))
{
Msisdn_array.remove("72");
Msisdn_array.remove("922");
}

if(Msisdn_array.contains("73") && Msisdn_array.contains("923"))
{
Msisdn_array.remove("73");
Msisdn_array.remove("923");
}

if(Msisdn_array.contains("74") && Msisdn_array.contains("924"))
{
Msisdn_array.remove("74");
Msisdn_array.remove("924");
}

if(Msisdn_array.contains("80") && Msisdn_array.contains("926"))
{
Msisdn_array.remove("80");
Msisdn_array.remove("926");
}

if(Msisdn_array.contains("81") && Msisdn_array.contains("927"))
{
Msisdn_array.remove("81");
Msisdn_array.remove("927");
}

if(Msisdn_array.contains("82") && Msisdn_array.contains("928"))
{
Msisdn_array.remove("82");
Msisdn_array.remove("928");
}

6 个答案:

答案 0 :(得分:1)

一个潜在的优化是您无需检查第二个项目是否在列表中。而只是尝试删除它。如果删除了remove方法will return true,您还可以删除第一项。

if(Msisdn_array.contains("60") && Msisdn_array.remove("910")){
    Msisdn_array.remove("60");
}

如果您不想写出每个if语句,可以将组存储在Map中,第一项作为键,第二项作为值。

Map<String, String> rules = new HashMap<>();
rules.put("60", "910");
rules.put("75", "500");
rules.put("76", "502");
...
...
for(Entry entry : rules.values()) {
    if(Msisdn_array.contains(entry.getKey()) && Msisdn_array.remove(entry.getValue())){
        Msisdn_array.remove(entry.getKey());
    }
}

答案 1 :(得分:1)

我认为您只需要提取一个方法来检查List中是否存在所有组值,然后删除所有组值。例如:

    private void removeIfAllExist(List<String> list, String[] values) {
    for (String v : values) {
        if (!list.contains(v)) {
            return;
        }
    }
    list.removeAll(Arrays.asList(values));
}

public void yourLogic() {
    List<String> list = new ArrayList<>(Arrays.asList("45", "85", "79", "60", "502"));
    String[][] conditions = new String[][]{
            new String[]{"60", "910"},
            new String[]{"75", "500"},
            new String[]{"76", "502"},
            new String[]{"61", "911"},
            new String[]{"77", "503"},
            // more conditions
    };
    for (String[] values : conditions) {
        removeIfAllExist(list, values);
    }
}

答案 2 :(得分:0)

如果您不经常遍历列表,我建议您使用Set。 在这个系列中搜索很快。

答案 3 :(得分:0)

contains是O(n)操作。遍历列表直到找到元素。因此,每次拨打contains时,您都可能会遍历整个列表。

优化可能是手动遍历列表一次,并检查元素是否存在,然后以一些额外的内存为代价进行删除,以存储布尔变量:

boolean exists_72 = false;
boolean exists_922 = false;

for(String element : Msisdn_array) {
    if(element.equals("72")) {
        exists_72 = true;
    } else if(element.equals("922")) {
        exists_922 = true;
    }
}

if(exists_72 && exists_922) }
    Msisdn_array.remove("72");
    Msisdn_array.remove("922");
}

答案 4 :(得分:0)

当删除返回一个布尔值已成功删除你可以做

if (list.remove ("60") && list.remove ("90"))
{
   // everything ok
}
else {
  // put back "60"
  list.add ("60");
}

我个人认为只是创建一个方法

removeBoth (String one, String two) {
  if(list.contains(one) && list.contains(two))
  {
     list.remove(one);
     list.remove(two);
  }
}

答案 5 :(得分:0)

由于List.contains缓慢而且因为List.remove更慢(因为它必须移动所有具有更大索引的元素以填补空白),所以它很慢。由于代码重复,它很难看。

Msisdn_array是针对Java命名约定的,它不是数组,所以我们称之为inputList。让我们使用HashSet进行查找,使用另一个来跟踪应删除的内容。

class Worker {
    private final Set<String> inputListAsSet = new HashSet<>();
    private final Set<String> removals = new HashSet<>();

    public static void process(List<String> inputList) {
        final Worker worker = new Worker(inputList);
        worker.removeIfBothPresent("60", "910");
        worker.removeIfBothPresent("75", "500");
        worker.removeIfBothPresent("76", "502");
        worker.removeIfBothPresent("61", "911");
        worker.removeIfBothPresent("72", "922");
        worker.removeIfBothPresent("73", "923");
        worker.removeIfBothPresent("74", "924");
        worker.removeIfBothPresent("80", "926");
        worker.removeIfBothPresent("81", "927");
        worker.removeIfBothPresent("82", "928");
        inputList.removeAll(worker.removals);
    }

    private Worker(List<String> inputList) {
        inputListAsSet.addAll(inputList);
    }

    private void removeIfBothPresent(String first, String second) {
        if (inputListAsSet.contains(first) && inputListAsSet.contains(second)) {
            removals.add(first);
            removals.add(second);
        }
    }
}

可以将集合作为参数传递,而不是使用类实例,但创建工作者似乎更清晰。请注意,尽管进行了优化,但我的代码比原始代码短。如果有重复,则不完全相同。