在已排序的数组列表中添加标记

时间:2016-12-31 07:07:55

标签: java sorting arraylist

说我在我的arrayList中有一堆排序记录(多次排序),例如:

Country : USA  , State : California , Users : 987
Country : USA  , State : California , Users : 934
Country : USA  , State : California , Users : 897
Country : USA  , State : Florida , Users : 745
Country : USA  , State : Florida , Users : 634
Country : USA  , State : Texas , Users : 564

你可以看到上面的数据已经排序了我想在这个数据上添加一个标签(比如一个索引),这样它就像这样:

Country : USA  , State : California , Users : 987 , addedTag : 1 // ranked by same country and state
Country : USA  , State : California , Users : 934 , addedTag : 2 // ranked by same country and state
Country : USA  , State : California , Users : 897 , addedTag : 3 // ranked by same country and state
Country : USA  , State : Florida , Users : 745  , addedTag : 1 // rank from starting cause its a new state
Country : USA  , State : Florida , Users : 634 ,  addedTag : 2
Country : USA  , State : Texas , Users : 564 , addedTag : 1

任何人都知道我该怎么做?

1 个答案:

答案 0 :(得分:1)

显然,所有这一切都需要迭代ArrayList并附加您想要的标签,其中增量计数的国家和州是相同的,但是重置国家和州不相同的计数。

下面是一个方便地命名为 addTag()的方法,它将执行此操作,如果您要处理数十万条记录,那么我建议在单独的线程或执行程序服务中运行代码。 / p>

  

注意:此方法将修改提供的ArrayList。如果你想保持原始的ArrayList,那么将克隆传递给   下面提供了addTag()方法。

以下是方法:

$

以下是可能使用它的方式:

private void addTag(ArrayList<String> array) {
    int counter = 0;
    String country = "";
    String state = "";

    for (int i = 0; i < array.size(); i++) {
        // Split the ArrayList comma delimited string element.
        String[] data = array.get(i).trim().split(",");
        String cntry = data[0].toLowerCase(); //hold the country for this element
        String stat = data[1].toLowerCase();  //hold the state for this element
        // start our tag appending
        if (i == 0) { 
            counter++;
            country = cntry;
            state = stat;
            array.set(i, array.get(i) + " , addtag : " + String.valueOf(counter));
        }
        else {
            // If we hit the same country and the same state again
            // then increment our counter and append tag to element.
            if (cntry.equalsIgnoreCase(country) && stat.equalsIgnoreCase(state)) {
                counter++;
                array.set(i, array.get(i) + " , addtag : " + String.valueOf(counter));
            }
            // If we don't hit the same country and the same state again
            // then reset the counter to 1 and append tag to element.
            else {
                country = cntry;
                state = stat;
                counter = 1;
                array.set(i, array.get(i) + " , addtag : " + String.valueOf(counter));
            }
        }
    }
}

这是示例控制台输出:

// Example ArrayList...
ArrayList<String> users = new ArrayList<>();
users.add("Country : CANADA  , State : Alberta , Users : 132");
users.add("Country : CANADA  , State : BC , Users : 232");
users.add("Country : CANADA  , State : BC , Users : 249");
users.add("Country : CANADA  , State : Ontario , Users : 888");
users.add("Country : CANADA  , State : Ontario , Users : 432");
users.add("Country : USA  , State : California , Users : 987");
users.add("Country : USA  , State : California , Users : 934");
users.add("Country : USA  , State : California , Users : 897");
users.add("Country : USA  , State : Florida , Users : 745");
users.add("Country : USA  , State : Florida , Users : 634");
users.add("Country : USA  , State : Texas , Users : 564");

// Before using the addtag() method...
for (int i = 0; i < users.size(); i++) {
    System.out.println(users.get(i));
}
System.out.println("\n===================================="
        + "==========================\n");

// The supplied ArrayList MUST be sorted
// before passing it to this method.
addTag(users);

// After using the addtag() method...
for (int i = 0; i < users.size(); i++) {
    System.out.println(users.get(i));
}