簡體   English   中英

我如何優化此代碼以看起來更高效?

[英]how i can optimize this code to look more performant?

我有這段Java代碼,將用戶年齡分為8組:

private int[] A0, A1, A2, A3, A4, A5, A6, A7, A8;

    public Grouping() {
        super();

        for (int i = 5; i < 10; i++)
            A0[i] = i;

        for (int i = 10; i < 20; i++)
            A1[i] = i;

        for (int i = 20; i < 30; i++)
            A2[i] = i;

        for (int i = 30; i < 40; i++)
            A3[i] = i;

        for (int i = 40; i < 50; i++)
            A4[i] = i;

        for (int i = 50; i < 60; i++)
            A5[i] = i;

        for (int i = 60; i < 70; i++)
            A6[i] = i;

        for (int i = 70; i < 80; i++)
            A7[i] = i;

        for (int i = 10; i < 20; i++)
            A8[i] = i;

    }

現在,我想優化此代碼。 有什么想法嗎?

您已經說過要“縮短”。 這是一個簡短的版本, 除了我不知道您要使用A8做什么,這對A1是多余的,因此省略了它:

private int[][] groups; // I assume you initialize `A0` and so on somewhere you haven't shown; initialize this there

public Grouping() {
    int i, groupIndex, group;

    super();

    groupIndex = 0;
    group = groups[0];
    for (i = 5; i < 80; ++i) {
        if (i % 10 == 0) {
            ++groupIndex;
            group = groups[groupIndex];
        }
        group[i] = i;
    }
}

請注意,盡管這仍然是很奇怪的代碼,因為它執行原始代碼所執行的操作,並將數組中的所有條目保留為默認值( 0 )。 例如,在您的代碼中,永遠不會將A0的索引04分配給它,上面的groups[0]04也是如此。 (並且后續的差距更大。)

不過, 標題表示您希望它更“出色”。 “ performant”!=“更短”您的代碼可能執行得很好,可能比上面的代碼好很多,因為它不需要%操作和if循環內的代碼。

或者這是實現Seelenvirtuose的建議的版本:

private int[][] groups; // I assume you initialize `A0` and so on somewhere you haven't shown; initialize this there

public Grouping() {
    int i;

    super();

    for (i = 5; i < 80; ++i) {
        groups[i / 10][i] = i;
    }
}

...之所以有效,是因為i / 10位是整數除法。

創建一個分組類別,該分組類別將保留年齡范圍和一個計數器以容納該分組的匹配項。 將組對象添加到列表中並播放。

public static void main(String[] args) {

    List<Group> lists = new ArrayList<Group>(10);

    lists.add(new Group(5, 10));
    lists.add(new Group(10, 20));
    lists.add(new Group(20, 30));
    lists.add(new Group(30, 40));

    int age[] = { 5, 10, 20, 30, 11, 22, 33 };

    for (int i = 0; i < age.length; i++)
        grouper: for (Group group : lists)
            if (group.validateAgeGroup(age[i]))
                break grouper;

    for (Group group : lists)
        System.out.println(group);
}

小組課程:年齡段和計數器:

public class Group {

    int startAge, endAge, counter;

    public Group(int startAge, int endAge) {
        this.startAge = startAge;
        this.endAge = endAge;
    }

    public boolean validateAgeGroup(int age) {
        if (age >= startAge && age < endAge) {
            this.setCounter(1);
            return true;
        }
        return false;
    }

    public int getCounter() {
        return counter;
    }

    public int getEndAge() {
        return endAge;
    }

    public int getStartAge() {
        return startAge;
    }

    public void setCounter(int counter) {
        this.counter += counter;
    }

    public void setEndAge(int endAge) {
        this.endAge = endAge;
    }

    public void setStartAge(int startAge) {
        this.startAge = startAge;
    }

    @Override
    public String toString() {
        return "Group [startAge=" + getStartAge() + ", endAge=" + getEndAge()
                + ", counter=" + getCounter() + "]";
    }
}

我會使用java8流。 參見我的示例代碼:

import java.util.stream.Collectors;
import java.util.stream.IntStream;

public class Grouping {
    public static void main(String[] args) {

        // create a stream from 5 (inclusive) to 80 (exclusive)
        IntStream.range(5, 80)

        // convert it to Integer objects
        .boxed()

        // group it by tens
        .collect(Collectors.groupingBy(i -> i / 10))

        // iterate over each group
        .entrySet().stream()

        // pretty format
        .map(entry -> "A"+entry.getKey()+"="+entry.getValue())

        // print to console
        .forEach(System.out::println);
    }
}

它輸出:

A0=[5, 6, 7, 8, 9]
A1=[10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
A2=[20, 21, 22, 23, 24, 25, 26, 27, 28, 29]
A3=[30, 31, 32, 33, 34, 35, 36, 37, 38, 39]
A4=[40, 41, 42, 43, 44, 45, 46, 47, 48, 49]
A5=[50, 51, 52, 53, 54, 55, 56, 57, 58, 59]
A6=[60, 61, 62, 63, 64, 65, 66, 67, 68, 69]
A7=[70, 71, 72, 73, 74, 75, 76, 77, 78, 79]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM