Java 行轉列詳解

一、基本概念

行轉列是指將一條記錄中的多個字段(列)轉換成多行記錄,每行記錄只包含一個字段(列),通常應用於數據透視表或統計分析中。Java 作為一種面向對象的編程語言,可以通過多種方式進行行轉列操作。

二、使用 SQL 實現行轉列

一般情況下,我們可以利用 SQL 語句來實現行轉列操作,主要是通過使用 PIVOT 或 UNPIVOT 等函數來實現。下面是一個示例代碼:

SELECT id,  
MAX(CASE WHEN property='age' THEN value END) AS age,  
MAX(CASE WHEN property='name' THEN value END) AS name,  
MAX(CASE WHEN property='gender' THEN value END) AS gender  
FROM yourtable  
GROUP BY id  

以上代碼中,使用 GROUP BY 根據 ID 進行分組,根據屬性字段使用 PIVOT 函數進行行轉列操作。

三、使用 Java 實現行轉列

1. 使用 List 和 Map 實現行轉列

Java 中可以通過 List 和 Map 來實現行轉列,主要是將每個字段(列)構造成一個 Map,然後將多個 Map 添加到一個 List 中。下面是一個示例代碼:

List<Map> list = new ArrayList();
 
Map map1 = new HashMap();
map1.put("name", "Tom");
map1.put("age", 18);
map1.put("gender", "male");
 
Map map2 = new HashMap();
map2.put("name", "Jerry");
map2.put("age", 20);
map2.put("gender", "female");
 
list.add(map1);
list.add(map2);
 
Map<String, List> resultMap = new HashMap();
for (Map map : list) {
    for (String key : map.keySet()) {
        if (resultMap.get(key) == null) {
            resultMap.put(key, new ArrayList());
        }
        resultMap.get(key).add(map.get(key));
    }
}

以上代碼中,我們將每個字段構造成一個 Map,然後將多個 Map 添加到一個 List 中。之後我們再遍歷這個 List,將每個 Map 中的字段添加到一個新的 Map 中,然後將這個 Map 添加到 resultMap 中。

2. 使用 Apache Commons Collections 實現行轉列

Java 中還可以通過 Apache Commons Collections 庫來實現行轉列操作,這個庫提供了一個 TransformedMap 類,可以將一個 Map 轉換為多個 Map,具體實現如下:

List<Map> list = new ArrayList();
 
Map map1 = new HashMap();
map1.put("name", "Tom");
map1.put("age", 18);
map1.put("gender", "male");
 
Map map2 = new HashMap();
map2.put("name", "Jerry");
map2.put("age", 20);
map2.put("gender", "female");
 
list.add(map1);
list.add(map2);
 
// 使用 TransformedMap 對每個字段進行處理
TransformedMap transformedMap = TransformedMap.transformedMap(
    new HashMap(),
    new Transformer<Map.Entry, Object>() {
        @Override
        public Object transform(Map.Entry input) {
            Map resultMap = new HashMap();
            resultMap.put(input.getKey(), input.getValue());
            return resultMap;
        }
    }
);
 
Map<String, List> resultMap = new HashMap();
for (Map map : list) {
    Map tempMap = TransformedMap.transformedMap(map, transformedMap);
    for (Map.Entry entry : tempMap.entrySet()) {
        if (resultMap.get(entry.getKey()) == null) {
            resultMap.put(entry.getKey(), new ArrayList());
        }
        resultMap.get(entry.getKey()).add(entry.getValue());
    }
}

以上代碼中,我們同樣是將每個 Map 中的字段添加到一個新的 Map 中,但是這裡使用了 Apache Commons Collections 庫提供的 TransformedMap 類來實現。

四、使用 Pandas 實現行轉列

Pandas 是一個 Python 的數據分析庫,它可以幫助我們進行數據清理、數據轉換、統計分析等操作。下面是一個 Pandas 實現行轉列的示例代碼:

import pandas as pd
 
data = pd.DataFrame({
    'name': ['Tom', 'Jerry'],
    'age': [18, 20],
    'gender': ['male', 'female']
})
 
result = pd.melt(data, id_vars=['name'], value_vars=['age', 'gender'])
result = result.pivot(index='name', columns='variable', values='value')
print(result)

以上代碼中,我們首先構造了一個包含三個字段的 DataFrame,然後使用 Pandas 的 melt 函數將這個 DataFrame 轉換成一個更長的格式,之後使用 pivot 函數進行行轉列操作。

五、總結

行轉列在數據透視表、統計分析等領域中非常常見,Java 作為一種面向對象的編程語言,也可以通過多種方式實現行轉列操作。除了 SQL 語句,還可以使用 List 和 Map、Apache Commons Collections、Pandas 等庫來實現行轉列操作,具體實現方式根據實際需求來進行選擇。

原創文章,作者:KNQJL,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/331821.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
KNQJL的頭像KNQJL
上一篇 2025-01-20 14:10
下一篇 2025-01-20 14:10

相關推薦

  • Java JsonPath 效率優化指南

    本篇文章將深入探討Java JsonPath的效率問題,並提供一些優化方案。 一、JsonPath 簡介 JsonPath是一個可用於從JSON數據中獲取信息的庫。它提供了一種DS…

    編程 2025-04-29
  • java client.getacsresponse 編譯報錯解決方法

    java client.getacsresponse 編譯報錯是Java編程過程中常見的錯誤,常見的原因是代碼的語法錯誤、類庫依賴問題和編譯環境的配置問題。下面將從多個方面進行分析…

    編程 2025-04-29
  • Java Bean加載過程

    Java Bean加載過程涉及到類加載器、反射機制和Java虛擬機的執行過程。在本文中,將從這三個方面詳細闡述Java Bean加載的過程。 一、類加載器 類加載器是Java虛擬機…

    編程 2025-04-29
  • Java騰訊雲音視頻對接

    本文旨在從多個方面詳細闡述Java騰訊雲音視頻對接,提供完整的代碼示例。 一、騰訊雲音視頻介紹 騰訊雲音視頻服務(Cloud Tencent Real-Time Communica…

    編程 2025-04-29
  • Java Milvus SearchParam withoutFields用法介紹

    本文將詳細介紹Java Milvus SearchParam withoutFields的相關知識和用法。 一、什麼是Java Milvus SearchParam without…

    編程 2025-04-29
  • Java 8中某一周的周一

    Java 8是Java語言中的一個版本,於2014年3月18日發布。本文將從多個方面對Java 8中某一周的周一進行詳細的闡述。 一、數組處理 Java 8新特性之一是Stream…

    編程 2025-04-29
  • Java判斷字符串是否存在多個

    本文將從以下幾個方面詳細闡述如何使用Java判斷一個字符串中是否存在多個指定字符: 一、字符串遍歷 字符串是Java編程中非常重要的一種數據類型。要判斷字符串中是否存在多個指定字符…

    編程 2025-04-29
  • VSCode為什麼無法運行Java

    解答:VSCode無法運行Java是因為默認情況下,VSCode並沒有集成Java運行環境,需要手動添加Java運行環境或安裝相關插件才能實現Java代碼的編寫、調試和運行。 一、…

    編程 2025-04-29
  • Java任務下發回滾系統的設計與實現

    本文將介紹一個Java任務下發回滾系統的設計與實現。該系統可以用於執行複雜的任務,包括可回滾的任務,及時恢復任務失敗前的狀態。系統使用Java語言進行開發,可以支持多種類型的任務。…

    編程 2025-04-29
  • Java 8 Group By 會影響排序嗎?

    是的,Java 8中的Group By會對排序產生影響。本文將從多個方面探討Group By對排序的影響。 一、Group By的概述 Group By是SQL中的一種常見操作,它…

    編程 2025-04-29

發表回復

登錄後才能評論