项目中有个算法写不出来了,求助各位大虾们

漆黑之勺 2014-06-19 08:02:52
加精
有如下一个列表,列表的每一条数据都存着A,B,C,D如下四个字段,结构如下:
A B C D
1 1 10 10
1 1 20 20
1 1 30 30
2 2 40 100
2 2 50 200
2 2 60 300
3 3 70 70
3 4 80 80
3 4 90 90
4 3 90 90
4 3 100 100
4 3 100 100

现在项目需求如下:
在AB列都必须相等的情况下,判断C列的和与D列的和是否相等,不相等输出“error”
比如:
AB列均为“1” C列10+20+30== D列的10+20+30,没有问题
AB列均为“2 ” C列40+50+60与 D列的100+200+300不相等,输出“error”

求助大神们,万分感激。

...全文
3210 57 打赏 收藏 转发到动态 举报
写回复
用AI写文章
57 条回复
切换为时间正序
请发表友善的回复…
发表回复
fang2020 2014-06-30
  • 打赏
  • 举报
回复
直接用SQL操作:
create table test(
item_a int,
item_b int,
item_c int,
item_d int
)
insert into test values(1,1,10,10)
insert into test values(1,1, 20,20)
insert into test values(1,1, 30,30)
insert into test values(2,2, 40,100)
insert into test values(2,2, 50,200)
insert into test values(2,2, 60,300)
insert into test values(3,3, 70,70)
insert into test values(3,4,80,80)
insert into test values(3,4,90,90)
insert into test values(4,3,90,90)
insert into test values(4,3,100,100)
insert into test values(4,3,100,100)

select item_a,case when sum(item_c) = sum(item_d) then '' else 'Error' end as testvalue
from test
where item_a = item_b
group by item_a


结果是:

blueink_200451 2014-06-25
  • 打赏
  • 举报
回复
这个应该很简单啊
缺省 2014-06-25
  • 打赏
  • 举报
回复
不错不错 顶一个
wszx1315 2014-06-24
  • 打赏
  • 举报
回复
真为楼主的表达能力拙计 。。能把你一开始的需求和你后面又提的需求统一一下嘛?
qinxiongxu 2014-06-24
  • 打赏
  • 举报
回复
这个也有难度??
Aspist 2014-06-23
  • 打赏
  • 举报
回复
楼主你还是转行吧
qq_16031849 2014-06-23
  • 打赏
  • 举报
回复
学习学习哈!!
pigpigappleapple 2014-06-23
  • 打赏
  • 举报
回复
,路过学习学习
lhw7791086 2014-06-22
  • 打赏
  • 举报
回复
之奇一昂 2014-06-22
  • 打赏
  • 举报
回复
引用 48 楼 Yushuhuihui 的回复:
[quote=引用 42 楼 szq80140 的回复:] 弄了半天你告诉我,不管A与B相等不相等,都要把C和D的列值求和各判断相等不相等,这与你之前的说法性质上不一样啊。 如果是这样的话,你把A与B的组合作为KEY,C与D的差作为值,放入map就可以了。 一个简单示例代码:

package csdn;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

class Data{
	private int argA;
	private int argB;
	private int argC;
	private int argD;
	public Data(){
		
	}
	public Data(int argA, int argB, int argC, int argD) {
		super();
		this.argA = argA;
		this.argB = argB;
		this.argC = argC;
		this.argD = argD;
	}
	public int getArgA() {
		return argA;
	}
	public void setArgA(int argA) {
		this.argA = argA;
	}
	public int getArgB() {
		return argB;
	}
	public void setArgB(int argB) {
		this.argB = argB;
	}
	public int getArgC() {
		return argC;
	}
	public void setArgC(int argC) {
		this.argC = argC;
	}
	public int getArgD() {
		return argD;
	}
	public void setArgD(int argD) {
		this.argD = argD;
	}
	@Override
	public String toString(){
		return String.format("[%d,%d,%d,%d]", argA, argB, argC, argD);
	}
	
}
public class DataChecker2 {

	private Map<String, Integer> map = new HashMap<String, Integer>();
	private void add(String key, Integer value){//私有方法
		if (map.containsKey(key)) {
			map.put(key, map.get(key)+value);//累加
		}else{
			map.put(key, value);//如果之前没有直接放入
		}
	}
	public void add(int argA, int argB, int argC, int argD){//传入为一个Data对象的四个参数
		add(argA+"_"+argB, argC - argD);
	}
	public void add(Data data){//参数为一个Data对象
		add(data.getArgA(), data.getArgB(), data.getArgC(), data.getArgD());
	}
	private boolean check(String key){
		Integer value = map.get(key);
		return null != value && value == 0;//只有不为null且等于0为真
	}
	public boolean check(int argA, int argB){//参数为A与B
		return check(argA + "_" + argB);
	}
	public boolean check(Data data){//传入为一个Data对象
		return check(data.getArgA(), data.getArgB());
	}
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		List<Data> list = new ArrayList<Data>();
		list.add(new Data(1, 1, 10, 10));
        list.add(new Data(1, 1, 20, 20));
        list.add(new Data(2, 2, 10, 10));
        list.add(new Data(2, 2, 20, 10));
        list.add(new Data(3, 4, 10, 10));

        DataChecker2 dc = new DataChecker2();
        for(Data data : list){
        	dc.add(data);
        }
        //打印
        for(Data data : list){
        	
        	System.out.print(data);
        	System.out.print("==>");
        	if(dc.check(data)){
        		System.out.println("true");
        	}else{
        		System.out.println("false");
        	}
        }
	}

}

输出结果: [1,1,10,10]==>true [1,1,20,20]==>true [2,2,10,10]==>false [2,2,20,10]==>false [3,4,10,10]==>true 还要改需求么?
输出结果第三行应该为true[/quote] 先看看他的需求,他的意思是先根据A,B值归类,再判断整个类中数据是否符合规定,true或false反应的就是整体,而不是单个
余书慧 2014-06-22
  • 打赏
  • 举报
回复
引用 42 楼 szq80140 的回复:
弄了半天你告诉我,不管A与B相等不相等,都要把C和D的列值求和各判断相等不相等,这与你之前的说法性质上不一样啊。 如果是这样的话,你把A与B的组合作为KEY,C与D的差作为值,放入map就可以了。 一个简单示例代码:

package csdn;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

class Data{
	private int argA;
	private int argB;
	private int argC;
	private int argD;
	public Data(){
		
	}
	public Data(int argA, int argB, int argC, int argD) {
		super();
		this.argA = argA;
		this.argB = argB;
		this.argC = argC;
		this.argD = argD;
	}
	public int getArgA() {
		return argA;
	}
	public void setArgA(int argA) {
		this.argA = argA;
	}
	public int getArgB() {
		return argB;
	}
	public void setArgB(int argB) {
		this.argB = argB;
	}
	public int getArgC() {
		return argC;
	}
	public void setArgC(int argC) {
		this.argC = argC;
	}
	public int getArgD() {
		return argD;
	}
	public void setArgD(int argD) {
		this.argD = argD;
	}
	@Override
	public String toString(){
		return String.format("[%d,%d,%d,%d]", argA, argB, argC, argD);
	}
	
}
public class DataChecker2 {

	private Map<String, Integer> map = new HashMap<String, Integer>();
	private void add(String key, Integer value){//私有方法
		if (map.containsKey(key)) {
			map.put(key, map.get(key)+value);//累加
		}else{
			map.put(key, value);//如果之前没有直接放入
		}
	}
	public void add(int argA, int argB, int argC, int argD){//传入为一个Data对象的四个参数
		add(argA+"_"+argB, argC - argD);
	}
	public void add(Data data){//参数为一个Data对象
		add(data.getArgA(), data.getArgB(), data.getArgC(), data.getArgD());
	}
	private boolean check(String key){
		Integer value = map.get(key);
		return null != value && value == 0;//只有不为null且等于0为真
	}
	public boolean check(int argA, int argB){//参数为A与B
		return check(argA + "_" + argB);
	}
	public boolean check(Data data){//传入为一个Data对象
		return check(data.getArgA(), data.getArgB());
	}
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		List<Data> list = new ArrayList<Data>();
		list.add(new Data(1, 1, 10, 10));
        list.add(new Data(1, 1, 20, 20));
        list.add(new Data(2, 2, 10, 10));
        list.add(new Data(2, 2, 20, 10));
        list.add(new Data(3, 4, 10, 10));

        DataChecker2 dc = new DataChecker2();
        for(Data data : list){
        	dc.add(data);
        }
        //打印
        for(Data data : list){
        	
        	System.out.print(data);
        	System.out.print("==>");
        	if(dc.check(data)){
        		System.out.println("true");
        	}else{
        		System.out.println("false");
        	}
        }
	}

}

输出结果: [1,1,10,10]==>true [1,1,20,20]==>true [2,2,10,10]==>false [2,2,20,10]==>false [3,4,10,10]==>true 还要改需求么?
输出结果第三行应该为true
liuhao182005 2014-06-21
  • 打赏
  • 举报
回复
#include "stdafx.h"
#include <string.h>

#pragma pack(4)
struct DataGroup
{
	int A;
	int B;
	int C;
	int D;
};
#pragma pack()

const DataGroup datas[] = {
	{ 1, 1, 10, 10 },
	{ 1, 1, 20, 20 },
	{ 1, 1, 30, 30 },
	{ 2, 2, 40, 100},
	{ 2, 2, 50, 200},
	{ 2, 2, 60, 300},
	{ 3, 3, 70, 70 },
	{ 3, 4, 80, 80 },
	{ 3, 4, 90, 90 },
	{ 4, 3, 90, 90 },
	{ 4, 3, 100,100},
	{ 4, 3, 100,100}
};

#define MAX_INT 0x7FFFFFFF

void procSum(int i, int dataCount, char* mark, int A, int B, int& sumC, int& sumD)
{
	for(; i < dataCount; i++)
	{
		if(datas[i].A == A && B == datas[i].B)
		{
			sumC += datas[i].C;
			sumD += datas[i].D;
			mark[i] = (char)1; //设置计算标识
		}
	}
}

int _tmain(int argc, _TCHAR* argv[])
{
	int start = 0;
	int sumC, sumD;
	int dataCount = sizeof(datas) / sizeof(DataGroup);

	if( dataCount < 1)
	{
		return 0;
	}

	//分配是否才查找过的标识
	char* mark = new char[dataCount];
	if(NULL == mark)
	{
		printf("Alloc new memory error.");
		return -1;
	}
	memset(mark, 0, dataCount);

	for(int i = start; i < dataCount; i++)
	{
		if(mark[i] == (char)0)
		{
			sumC = 0; sumD = 0;
			procSum( i, dataCount, mark, datas[i].A, datas[i].B, sumC, sumD);

			printf("A: %d, B: %d, sumC: %d, sumD: %d. ", datas[i].A, datas[i].B, sumC, sumD);
			if(sumC != sumD)
			{
				printf("Result: error.\n");
			}
			else
			{
				printf("Result: Success.\n");
			}
		}
	}

	return 0;
}
sca4441479 2014-06-20
  • 打赏
  • 举报
回复
我去,没法编辑自己帖子,刚才有写错,是这样 List<Integer> a=new ArrayList<Integer>(); for(Data d : list){ if(map.containsKey(d.getArgA())){ if(a.contains(d.getArgA())){ continue; }else{ a.add(d.getArgA()); } System.out.print(d.getArgA()+"\t"+d.getArgB()+"\t"); if(dc.check(d.getArgA(), d.getArgB())){ System.out.println("true"); }else{ System.out.println("error"); } } } 结果: 1 1 true 2 2 error
sca4441479 2014-06-20
  • 打赏
  • 举报
回复
引用 楼主 blackspoon123 的回复:
/**运行结果: 1,1,10,10 true 1,1,20,20 true 2,2,10,10 error 3,4,10,10 error 2,2,20,10 error */ [/code]
[/quote] 感觉逻辑应该是对的,只是输出没有达到楼主想要的,改了一下输出方式,楼主认为这样如何? List<Integer> a=new ArrayList<Integer>(); for(Data d : list){ if(map.containsKey(d.getArgA())){ if(a.contains(d.getArgA())){ continue; }else{ a.add(d.getArgA()); } System.out.print(d); if(dc.check(d.getArgA(), d.getArgB())){ System.out.println(" true"); }else{ System.out.println(" error"); } } 结果: 1 1 true 2 2 error
疯狂的玖号 2014-06-20
  • 打赏
  • 举报
回复
引用 15 楼 rui888 的回复:
楼上的,分组sum 满足不?
子查询不是只是获取 C 与 D 的和么 条件是A=B A 分组 外查询才比对,是我理解错了还是? 求指点
lousang123 2014-06-20
  • 打赏
  • 举报
回复
引用 6 楼 amdunkszy 的回复:
是这个意思吗 实在不明白a b为什么分成两列 select a, b, case when sum(c) = sum(d) then 'accept' else 'error' end from table_name group by a ,b
这个就可以实现楼主描述的了
足球中国 2014-06-20
  • 打赏
  • 举报
回复
select sum(d)as d,sum(c) as c from table where a=b group by a select * from ( select sum(d)as d,sum(c) as c from table where a=b group by a ) where d=c 没试不知道正确不正确。
bree06 2014-06-20
  • 打赏
  • 举报
回复
这是找出所有error的
select T1.* from (
select A,sum(C) as SC, sum(D) as SD from item where A = B group by A) T1
where T1.SC <> T1.SD
l4kangaxx 2014-06-20
  • 打赏
  • 举报
回复
用sql还是c++ sql 这么来
select case sum(c) - sum(d) when 0 then 'true' else 'false' from tablename where a  = b group by a,b
c++的话么先定义一个结构体或者类,然后排序(排序同学你就自己做吧,你别说排序不会呀),最后逐条判断,输出

#include <iostream>
#define INT_DATA_NUM 10
struct Data
{
  int a;
  int b;
  int c;
  int d;
}

int main()
{
  Data MyDatas[INT_DATA_NUM];
  for (int i = 0; i < INT_DATA_NUM; i++)
 {
     MyDatas[i].a =// 自己填吧,ABCD,生成待判断的数据
 }
//接下来排序,排序方法很多自己弄吧,比如你可以把A * 10000然后加上B生成一个AB,用AB排序,冒泡就行。(取决于A,B的最大值)


//判断c和d的值。
int SumC,SumD, LastA, LastB;
SumC = 0;
SumD = 0;
for(int j = 0 ; j <  INT_DATA_NUM; j++)
{
   if (j == 0)
  {
      LastA = MyDatas[j].a;
      LastB = MyDatas[j].b;
      SumC = MyDatas[j].c;
      SumD = MyDatas[j].d;
  }
  else
  {
     
     if (MyDatas[j].a == LastA && MyDatas[j].b == LastB)
    {
       SumC += MyDatas[j].c;
       SumD += MyDatas[j].d;
    }
    else 
    {
        if (SumC == SumD  && LastA == LastB)
           cout << "true" << endl;
        else (SumC!= SumD && LastA == LastB)
           cout << "false" << endl;
        SumC = 0;
        SumD = 0;
    }
  }
  
}




}









代码细节可能有错,总之你领会一下意思,自己好好写。不要学上班逢包就发到青岛的美国佬。
漆黑之勺 2014-06-20
  • 打赏
  • 举报
回复
引用 30 楼 szq80140 的回复:
[quote=引用 29 楼 blackspoon123 的回复:] [quote=引用 楼主 blackspoon123 的回复:] 有如下一个列表,列表的每一条数据都存着A,B,C,D如下四个字段,结构如下: A B C D 1 1 10 10 1 1 20 20 1 1 30 30 2 2 40 100 2 2 50 200 2 2 60 300 3 3 70 70 3 4 80 80 3 4 90 90 4 3 90 90 4 3 100 100 4 3 100 100 现在项目需求如下: 在AB列都必须相等的情况下,判断C列的和与D列的和是否相等,不相等输出“error” 比如: AB列均为“1” C列10+20+30== D列的10+20+30,没有问题 AB列均为“2 ” C列40+50+60与 D列的100+200+300不相等,输出“error” 求助大神们,万分感激。
还有一个问题是 怎么输出不等列的在列表的位置番号 例如上面: AB列均为“2 ” C列40+50+60与 D列的100+200+300不相等,输出“error” 还要输出 “第4行 第5行 第6行 错误” [/quote] 不知道你具体数据结构,看一下这样写是否符合你的要求。羡丑:

package csdn;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

class Data{
	/**
	 * 模拟一下数据
	 */
	private int argA;
	private int argB;
	private int argC;
	private int argD;
	public int getArgA() {
		return argA;
	}
	public void setArgA(int argA) {
		this.argA = argA;
	}
	public int getArgB() {
		return argB;
	}
	public void setArgB(int argB) {
		this.argB = argB;
	}
	public int getArgC() {
		return argC;
	}
	public void setArgC(int argC) {
		this.argC = argC;
	}
	public int getArgD() {
		return argD;
	}
	public void setArgD(int argD) {
		this.argD = argD;
	}
	public Data(int argA, int argB, int argC, int argD) {
		super();
		this.argA = argA;
		this.argB = argB;
		this.argC = argC;
		this.argD = argD;
	}
	public Data(){
		
	}
	@Override
	public String toString(){
		return String.format("%d,%d,%d,%d", argA, argB, argC, argD);
	}
	
}
/**
 * 数据检测
 * @author sztsiang
 *
 */
public class DataChecker {

	private  Map<Integer, Integer> map = new HashMap<Integer, Integer>();
	
	private void add(int key, int value){
		if(map.containsKey(key))
			map.put(key, map.get(key) + value);
		else{
			map.put(key, value);
		}
	}
	
	public void add(int argA, int argB, int argC, int argD){
		if(argA == argB){
			add(argA, argC - argD);
		}
	}
	private boolean check(int key){
		Integer v = map.get(key);
		return null != v && v == 0;//仅值不为空且为0时为符合条件的
	}
	
	public boolean check(int argA, int argB){
		return argA == argB && check(argA);//仅A值与B值相等才去查找,否则直接不符合
	}
	
	public static void main(String[] args) {
		// TODO Auto-generated method
		List<Data> list = new ArrayList<Data>();//表面上模拟一下,不知道你项目中真实的数据结构
		list.add(new Data(1, 1, 10, 10));
		list.add(new Data(1, 1, 20, 20));
		list.add(new Data(2, 2, 10, 10));
		list.add(new Data(3, 4, 10, 10));
		list.add(new Data(2, 2, 20, 10));
		
		DataChecker dc = new DataChecker();
		//存入map
		for(Data data : list){
			dc.add(data.getArgA(), data.getArgB(), data.getArgC(), data.getArgD());
		}
		//遍历打印
		for(Data d : list){
			System.out.print(d);
			if(dc.check(d.getArgA(), d.getArgB())){
				System.out.println(" true");
			}else{
				System.out.println(" error");
			}
		}
	}

}
/**运行结果:
1,1,10,10 true
1,1,20,20 true
2,2,10,10 error
3,4,10,10 error
2,2,20,10 error
*/
[/quote] 可能是我没说清楚 A列和B列完全一样的时候,是一个组合,此时判断这组数据的C列和D列是否相等。 1,1,10,10 true 1,1,20,20 true 这个是对的,这组数据,C列的和等于D列的和,所以输出“true”。 2,2,10,10 error 2,2,20,10 error 这个是对的,这组数据,C列的和不等于D列的和,所以输出“false”。 3,4,10,10 error 这个是错的,这组数据,C列的和等于D列的和,所以输出“true”。
加载更多回复(34)

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧