一个简单的二维数组迭代

今天做项目,碰到一个二维数据迭代的问题,现封装成一个简单的方法。欢迎提出更好的建议,我是使用二维数组迭代的。
使用的是模拟数据迭代,真实数据可以传入几个List(如果使用sql语句的group by,将很方便),还有一个表头就可以了,如果有不同的需求可以修改下面的方法。
[code]
/**
* 2007, 北京, 2
* 2007, 上海, 2
* 2006, 广州, 6
* 2006, 南京, 7
* 2005, 湖南, 8
* 2005, 湖北, 9
* 2004, 天津, 3
* 2004, 海南, 7
* @param tableHead 纵轴的表头
* @param xlist 横轴
* @param ylist 纵轴
* @param reportList 记录数据
* @return
*/
public String[][] getReportArray(String tableHead, List xlist, List ylist, List reportList) {

int x_len = xlist.size();
int y_len = ylist.size();
//第一维数组为y轴,第二维数组为x轴
String[][] reportArray = new String[y_len + 2][x_len + 2];
reportArray[0][0] = tableHead;
reportArray[0][x_len + 1] = "总计";
for(int x = 1; x < x_len + 1; x++) {
reportArray[0][x] = (String) xlist.get(x - 1);
}
for(int y = 1; y < y_len + 1; y++) {
reportArray[y][0] = (String) ylist.get(y - 1);
}

int report_len = reportList.size();
double amount = 0;
double[] y_amount = new double[x_len + 2];
for(int y = 1; y < y_len + 1; y++) {
double x_count = 0;
for(int x = 1; x < x_len + 1; x++) {
for(int k = 0; k < report_len; k++) {
ReportBean reportBean = (ReportBean) reportList.get(k);
if(reportBean.getX().equals(xlist.get(x - 1)) && reportBean.getY().equals(ylist.get(y - 1))) {
String value = reportBean.getValue();
reportArray[y][x] = reportBean.getValue();
x_count += Double.parseDouble(value);
amount += Double.parseDouble(value);
}
}
//如果不存在数据,则为0
if(reportArray[y][x] == null) {
reportArray[y][x] = "0";
}
y_amount[x] += Double.parseDouble(reportArray[y][x]);
reportArray[y_len + 1][x] = y_amount[x] + "";
}
reportArray[y][x_len + 1] = x_count + "";
}
reportArray[y_len + 1][0] = "合计";
reportArray[y_len + 1][x_len + 1] = amount + "";
return reportArray;
}
[/code]
在C++中,有多种使用迭代器输出二维数组的方法,以下是不同场景下的示例: ### 普通二维数组(C风格数组) 对于普通的二维数组,可以使用C++11引入的`begin()`和`end()`函数来实现迭代器操作: ```cpp #include<iostream> #include<iterator> // begin(), end() c++11 using namespace std; int main() { int arr[3][4] = { {1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12} }; for (auto i = begin(arr); i != end(arr); i++) { for (auto j = begin(*i); j != end(*i); j++) { cout << *j << " "; } cout << endl; } return 0; } ``` 此代码先通过`begin(arr)`和`end(arr)`获取行的迭代器,再通过`begin(*i)`和`end(*i)`获取每行元素的迭代器,从而实现对二维数组的遍历输出 [^1]。 ### 二维`vector` 对于二维`vector`,需要使用`vector`的迭代器进行操作,要注意`*iter1`的括号: ```cpp #include<iostream> #include<vector> using namespace std; int main() { vector<vector<int>> forest = {{1, 2, 3}, {0, 0, 4}, {7, 6, 5}}; for (auto iter1 = forest.begin(); iter1 != forest.end(); iter1++) { for (auto iter2 = (*iter1).begin(); iter2 != (*iter1).end(); iter2++) { cout << *iter2 << " "; } cout << endl; } return 0; } ``` 这里先使用`vector<vector<int>>::iterator`类型的迭代器`iter1`遍历外层`vector`,再使用`vector<int>::iterator`类型的迭代器`iter2`遍历内层`vector`,实现二维`vector`的输出 [^5]。 ### 范围for结合引用 对于普通二维数组,还可以使用范围for结合引用的方式,这种方式也可看作是迭代器的一种隐式使用: ```cpp #include <iostream> int main() { int ia[3][4] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12}; for (auto &row : ia) { for (auto a : row) { cout << a << ' '; } cout << endl; } return 0; } ``` 通过范围for和引用`auto &row`遍历每一行,再使用范围for遍历每行的元素,实现二维数组的输出 [^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值