如何将具有重复属性的元组组合成一个元组?

Posted

技术标签:

【中文标题】如何将具有重复属性的元组组合成一个元组?【英文标题】:How do you combine tuples with repeating attributes into one tuple? 【发布时间】:2020-04-23 18:08:39 【问题描述】:

我创建了一个与 SQL 数据库中的表同名的 java 类,并使用从该表中检索到的信息从该 Java 类中创建了多个对象,并将它们存储在一个 ArrayList 中。

CREATE TABLE `orderdetails` (
  `orderNumber` int(11) NOT NULL,
  `productCode` varchar(15) NOT NULL,
  `quantityOrdered` int(11) NOT NULL,
  `priceEach` decimal(10,2) NOT NULL,
  `orderLineNumber` smallint(6) NOT NULL,
  PRIMARY KEY (`orderNumber`,`productCode`),
  KEY `productCode` (`productCode`),
  CONSTRAINT `orderdetails_ibfk_1` FOREIGN KEY (`orderNumber`) REFERENCES `orders` (`orderNumber`),
  CONSTRAINT `orderdetails_ibfk_2` FOREIGN KEY (`productCode`) REFERENCES `products` (`productCode`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

元组有重复的orderNumber,例如:

(10100,'S18_1749',30,'136.00',3),

(10100,'S18_2248',50,'55.09',2),

(10100,'S18_4409',22,'75.46',4),

然后将每个元组转换为与表同名的类的 java 对象,并存储在 Arraylist 中。

public ArrayList<OrderDetails> getOrders(String tableName) throws SQLException
        ArrayList<OrderDetails>od=new ArrayList<OrderDetails>();

        try 
            String query="SELECT * FROM "+tableName;
            Statement s= con.createStatement();
            ResultSet rs= s.executeQuery(query);

            while(rs.next()) 

                int orderNumber=rs.getInt("orderNumber");
                String productCode=rs.getString("productCode");
                int quantityOrdered=rs.getInt("quantityOrdered");
                double priceEach=rs.getDouble("priceEach");
                int orderLineNumber=rs.getInt("orderLineNumber");

                OrderDetails temp=new OrderDetails(orderNumber, productCode, quantityOrdered, priceEach, orderLineNumber);
                od.add(temp);

            

        
        catch(SQLException e) 

            System.out.println("SQL exception happened while retriving data, close connection");

            throw new RuntimeException(e);  
        
        return od;
    

我正在尝试循环遍历 ArrayList 并输出每个 checkNumber 的总价值(priceEach 乘以 quantityOrdered )。但是,如果我只是逐个对象地循环遍历 ArrayList,那是行不通的。因为我将在控制台上简单地看到每个对象的总和,而不是每个 checkNumber。

ArrayList<OrderDetails>od= this.getOrders("orderdetails");
for(int i=0;i<=od.size();i++) 
         System.out.println(od.get(i).getPriceEach()*od.get(i).getQuantityOrdered());

     

我希望这样的东西会出现在控制台上(没有重复的 checkNumber)

CheckNumber 10100, total value: 8494.62 (if you add up the product between priceEach and quantityOrdered for the three tuples shown above earlier in my question is the rsult)

简而言之,有没有办法将具有重复属性的对象组合成一个? 如果我的问题看起来很模糊,并且您不确切知道问题出在哪里,我深表歉意。 如果您尝试联系我并要求进一步澄清,我们将不胜感激,有时很难描述一个过于具体的问题..

【问题讨论】:

【参考方案1】:

为什么不简单地在数据库中进行计算呢?与 Java 中的迭代循环相比,SQL 是一种基于集合的语言,在这种类型的操作中非常高效。

考虑以下聚合查询:

select orderNumber, sum(quantityOrdered * priceEach) totalValue
from mytable
group by orderNumber

这为每个订单提供了一条记录,其中包含所有相应行的总值。

【讨论】:

这听起来是个好主意!但是因为这个课程是为了让我练习动态 Java 编程,所以恐怕我不能使用复杂的 SQL 语句......不过还是感谢你的建议!

以上是关于如何将具有重复属性的元组组合成一个元组?的主要内容,如果未能解决你的问题,请参考以下文章

对具有名称的元组列表进行排序[重复]

如何根据元组的索引值从列表中删除重复的元组,同时保持元组的顺序? [复制]

如何从python中的列表中删除重复的元组?

同一表中具有不同值的重复字段

Python中dict的元组列表[重复]

根据值对python中的元组进行排序[重复]