在 Java 中将 ArrayList 转换为 Set

ArrayList 是 List 接口的实现类,用于以线性顺序存储数据,而 set 是具有 HashSet 类来存储数据的接口。这两者之间的主要区别是 HashSet 不允许重复元素并存储唯一元素。

本教程将介绍将 ArrayList 转换为 HashSet 的不同方法。

在 Java 中使用 Naive 方法将 ArrayList 转换为 HashSet

这是将列表转换为集合的最基本方法。

在这种方法中,我们首先声明一个空集。然后我们遍历列表并使用 HashSet.add() 方法将其元素一一添加到集合中。当循环终止时,列表被转换为一个集合。

看看下面的代码。

import java.util.*;
public class SimpleTesting {
	public static void main(String args[]) {
		// initialise a list
		List<String> list = Arrays.asList("Karan", "Rahul", "Jay", "Laxman", "Praful", "Kushagra", "Karan");
		//intialise a set
		Set<String> set  = new HashSet<String>();
		// apply for loop
		for(String ele : list){
			set.add(ele);
		}
		// display the set
		for(String ele : set){
			System.out.println(ele);
		}
	}
}

输出:

Rahul
Kushagra
Jay
Karan
Laxman
Praful

在上面的代码中,我们创建了一个存储一些名称的列表。我们还初始化了一个名为 set 的空 Set。

然后我们遍历列表并添加其元素以一一设置。最后,我们打印集合的元素。请注意如何消除列表中的重复元素。

使用 Java 中的构造函数将 ArrayList 转换为 HashSet

这种方法是所有方法中最简单的。在这种方法中,我们将需要转换的列表传递给 HashSet 类的构造函数。

这消除了之前方法中所需的 for 循环的需要。构造函数返回一个包含所有唯一元素的新集合。

看看下面的代码。

import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
public class SimpleTesting {
	public static void main(String args[])
	{
		// initialise a list
		List<String> list = Arrays.asList("Karan", "Rahul", "Jay", "Laxman", "Praful", "Kushagra", "Karan");
		//intialise a set
		Set<String> set  = new HashSet<String>(list);
		// display the set
		for(String ele : set){
			System.out.println(ele);
		}
	}
}

输出:

Rahul
Kushagra
Jay
Karan
Laxman
Praful

在上面的代码中,我们创建了一个存储一些名称的列表。我们还初始化了一个名为 set 的空 Set。

我们将列表作为参数传递给 HashMap 的构造函数。最后,我们打印集合的元素。请注意如何消除列表中的重复元素。

使用 Java 8 Stream API 将 ArrayList 转换为 HashSet

在这种方法中,我们使用 Java 8 Stream API 将 ArrayList 转换为 HashSet。我们首先将列表转换为流。然后我们将 collect 函数应用于流。

为了转换成一个集合,我们在 collect 操作中使用 Collectors.toSet() 函数来获取一个集合。看看下面的代码。

import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
public class SimpleTesting {
	public static void main(String args[])
	{
		 // initialise a list
        List<String> list = Arrays.asList("Karan", "Rahul", "Jay", "Laxman", "Praful", "Kushagra", "Karan");
        //intialise a set using stream
        Set<String> set  = list.stream().collect(Collectors.toSet());
        // display the set
        for(String ele : set){
            System.out.println(ele);
        }
	}
}

输出:

Rahul
Kushagra
Jay
Karan
Laxman
Praful

我们使用上面代码中的 List.stream() 函数将列表转换为流。我们将 collect 操作应用于流并将 Collectors.toSet() 方法作为参数传递。

这导致将流转换为集合。然后我们将这个集合存储在变量集合中。

使用 Java 中的 Set.copyOf() 方法将 ArrayList 转换为 HashSet

Java 10 提供了一个 Set.copyof() 方法,该方法将 Collection 作为其参数并返回一个包含给定 Collection 元素的不可变集合。在这种方法中,我们使用 Set.copyOf() 方法将 ArrayList 转换为 HashSet。

import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
public class SimpleTesting {
	public static void main(String args[])
	{
		// initialise a list
        List<String> list = Arrays.asList("Karan", "Rahul", "Jay", "Laxman", "Praful", "Kushagra", "Karan");
        //intialise a set
        Set<String> set  = Set.copyOf(list);
        // display the set
        for(String ele : set){
            System.out.println(ele);
        }
	}
}

输出:

Rahul
Kushagra
Jay
Karan
Laxman
Praful

在 Java 中使用 Apache Commons 集合库将 ArrayList 转换为 HashSet

如果你正在使用 Apache Commons Collection 库,请使用带有两个参数的 CollectionUtils.addAll() 方法:目标集合对象和源集合对象。

源集合对象的值被复制到目标集合对象中并创建一个集合。看看下面的代码。

此代码使用 Apache 公共库的依赖代码。首先,将此依赖项添加到你的 Java 项目中以成功执行此代码。

<!-- https://mvnrepository.com/artifact/commons-collections/commons-collections -->
<dependency>
    <groupId>commons-collections</groupId>
    <artifactId>commons-collections</artifactId>
    <version>3.2.2</version>
</dependency>
import java.util.*;
public class SimpleTesting {
    public static void main(String args[]) {
        // initialise a list
        List<String> sourcelist = Arrays.asList("Karan", "Rahul", "Jay", "Laxman", "Praful", "Kushagra", "Karan");
        //intialise a set
        Set<String> targetset  = new HashSet<String>();
        // Adding elements
        CollectionUtils.addAll(targetset, sourcelist);
        // display the set
        for(String ele : targetset){
            System.out.println(ele);
        }
     }
}

输出:

Rahul
Kushagra
Jay
Karan
Laxman
Praful

在 Java 中将 ArrayList 转换为 Int 数组

我们可以将原始数据类型(具有定义大小的数据类型,包括类似类型的数据,如字节、字符、短、整数等)和类对象存储在数组中。

而我们只能将类对象存储在 ArrayList 中。此外,ArrayList 具有动态长度,可以根据元素的数量增加或减少。

在本文中,我们将讨论在 Java 中将数组列表转换为 int 数组的不同方法。

在 Java 中需要将 Arraylist 转换为 Int 数组

我们可以在 ArrayList 的帮助下执行使用数组完成的所有操作。

但是 ArrayList 在执行不同的操作时相对较慢。这是因为 ArrayList 有一系列动作,如 get()put()resize() 等,所有这些都会影响 CPU 时间和内存利用率。

如果你只需要对固定大小的数据执行某些操作,则必须始终使用 Arrays 而不是 ArrayList。

在 Java 中将 Arraylist 转换为 Int 数组的方法

假设我们得到一个整数的 ArrayList。我们需要将 ArrayList 转换为 int Array。我们可以使用 for 循环、Object[] toArray() 方法、T[] toArray() 方法和 mapToInt() 方法来做到这一点。

让我们一一讨论每种方法。

使用 for 循环将 Arraylist 转换为 Int 数组

我们可以使用 for 循环手动将 ArrayList 转换为 int 数组。如果给定一个 ArrayList,我们将首先声明一个与 ArrayList 大小相同的 int 数组。

我们可以使用 size() 函数来计算 ArrayList 的大小。我们现在可以将 ArrayList 中的数据元素复制到 int 数组中。

为此,我们将使用 get() 方法和 for 循环来遍历 ArrayList 元素。我们在下面的 solve() 函数中实现了这种方法。

让我们看一下下面的代码,以了解它是如何工作的。

import java.io.*;
import java.util.List;
import java.util.ArrayList;
public class Main
{
    public static void solve(List<Integer> nums)
    {
      int[] arr=new int[nums.size()];
      for(int i=0;i<nums.size();i++)
      {
        arr[i]=nums.get(i);
      }
      for (int i=0;i<arr.length;i++)
      {
        System.out.println(arr[i]);
      }
    }
    public static void main(String[] args)
    {
        List<Integer> nums = new ArrayList<Integer>();
        nums.add(10);
        nums.add(20);
        nums.add(30);
        nums.add(40);
        nums.add(50);
        System.out.println("ArrayList elements");
        for (int i=0;i<nums.size();i++)
        {
            System.out.println(nums.get(i));
        }
        System.out.println("Array elements");
        solve(nums); // ArrayList to Array Conversion
    }
}

输出:

ArrayList elements
10
20
30
40
50
Array elements
10
20
30
40
50

使用 Object[] toArray() 函数将 Arraylist 转换为 Int 数组

我们还可以使用 Object[] toArray() 函数将 ArrayList 转换为 Java 中的 int 数组。

如果给定一个 ArrayList,我们将首先构建一个 Object 对象并使用 toArray() 函数。请记住,toArray() 方法返回一个 Object 类型的数组。

为了消除这种情况,我们必须将其类型转换为所需的数据类型(在本例中为 int)以避免编译错误。我们在下面的 solve() 函数中实现了这种方法。

让我们看一下下面的代码,以了解它是如何工作的。

import java.io.*;
import java.util.List;
import java.util.ArrayList;
public class Main
{
    public static void solve(List<Integer> nums)
    {
      Object[] obj_arr= nums.toArray();
      int[] arr=new int[nums.size()];
      for(int i=0;i<obj_arr.length;i++)
      {
        arr[i]=(int)obj_arr[i];
      }
      for (int i=0;i<arr.length;i++)
      {
        System.out.println(arr[i]);
      }
    }
    public static void main(String[] args)
    {
        List<Integer> nums = new ArrayList<Integer>();
        nums.add(10);
        nums.add(20);
        nums.add(30);
        nums.add(40);
        nums.add(50);
        System.out.println("ArrayList elements");
        for (int i=0;i<nums.size();i++)
        {
            System.out.println(nums.get(i));
        }
        System.out.println("Array elements");
        solve(nums); // ArrayList to Array Conversion
    }
}

输出:

ArrayList elements
10
20
30
40
50
Array elements
10
20
30
40
50

使用 T[] toArray 函数将 Arraylist 转换为 Int 数组

我们还可以使用 T[] toArray() 函数将 ArrayList 转换为 Java 中的 int 数组。如果给定一个 ArrayList,我们将首先构建一个 Integer 对象并使用 toArray() 函数。

在这种方法中,如果数组不够大,则为此分配一个相同类型的新数组。我们在下面的 solve() 函数中实现了这种方法。

让我们看一下下面的代码,以了解它是如何工作的。

import java.io.*;
import java.util.List;
import java.util.ArrayList;
public class Main
{
    public static void solve(List<Integer> nums)
    {
      Integer[] int_arr=new Integer[nums.size()];
      int_arr=nums.toArray(int_arr);
      int[] arr=new int[nums.size()];
      for(int i=0;i<int_arr.length;i++)
      {
        arr[i]=int_arr[i];
      }
      for (int i=0;i<arr.length;i++)
      {
        System.out.println(arr[i]);
      }
    }
    public static void main(String[] args)
    {
        List<Integer> nums = new ArrayList<Integer>();
        nums.add(10);
        nums.add(20);
        nums.add(30);
        nums.add(40);
        nums.add(50);
        System.out.println("ArrayList elements");
        for (int i=0;i<nums.size();i++)
        {
            System.out.println(nums.get(i));
        }
        System.out.println("Array elements");
        solve(nums); // ArrayList to Array Conversion
    }
}

输出:

ArrayList elements
10
20
30
40
50
Array elements
10
20
30
40
50

使用 mapToInt() 函数将 Arraylist 转换为 Int 数组

我们还可以将 ArrayList 转换为 Java 中的 int 数组,方法是将列表中的 streams() 方法与 mapToInt() 函数相结合,该函数将 ArrayList 中的数据转换为原始整数值。这是一种将 ArrayList 转换为可从 Java 8 开始访问的整数数组的新方法。

如果给定一个 ArrayList,我们将首先在提供的 ArrayList 上调用 stream() 函数。之后,我们将调用 mapToInt() 方法,该方法返回一个包含结果的整数流。

之后,我们将调用 toArray() 方法,它将提取的结果转换为 int 数组。我们在下面的 solve() 函数中实现了这种方法。

让我们看一下下面的代码,以了解它是如何工作的。

import java.io.*;
import java.util.List;
import java.util.ArrayList;
public class Main
{
    public static void solve(List<Integer> nums)
    {
      int[] arr = nums.stream().mapToInt(i -> i).toArray();
      for (int i=0;i<arr.length;i++)
      {
        System.out.println(arr[i]);
      }
    }
    public static void main(String[] args)
    {
        List<Integer> nums = new ArrayList<Integer>();
        nums.add(10);
        nums.add(20);
        nums.add(30);
        nums.add(40);
        nums.add(50);
        System.out.println("ArrayList elements");
        for (int i=0;i<nums.size();i++)
        {
            System.out.println(nums.get(i));
        }
        System.out.println("Array elements");
        solve(nums); // ArrayList to Array Conversion
    }
}

输出:

ArrayList elements
10
20
30
40
50
Array elements
10
20
30
40
50

在 JavaScript 中将 ASCII 转换为十六进制

制定美国信息交换标准代码 (ASCII) 的主要目的是在设备之间交换数据。ASCII 是具有人类可读字符的代码表,它由映射到特定数字的每个字符(所谓的 ASCII 代码)组成。与计算机使用的二进制基数系统一样,我们在通过通道传输数据时使用十六进制数系统以实现无差错通信。ASCII 是一种人类可读的格式,计算机内部使用的格式不同。让我们看看如何使用 JavaScript 将 ASCII 值转换为十六进制值。

在 JavaScript 中将 ASCII 字符转换为十六进制

转换很容易,不需要代码中的很多步骤。让我们看看将 ASCII 字符转换为十六进制的代码。

window.onload = function () {
    convertASCIItoHex("A");
    convertASCIItoHex("n");
    convertASCIItoHex("!");
}
function convertASCIItoHex(asciiVal) {
    let asciiCode = asciiVal.charCodeAt(0);
    let hexValue = asciiCode.toString(16);
    console.log("0x" + hexValue);
}

输出:

0x41
0x6e
0x21

在本节中,我们将处理将 ASCII 字符转换为其等效的十六进制字符。我们将转换过程解释如下。

  • 在 javascript 的 window.onload() 函数中,我们调用 convertASCIItoHex() 函数将 ASCII 值转换为 javascript 中的十六进制值。window.onload() 函数在页面加载时调用,以便在页面加载后立即执行该函数。
  • convertASCIItoHex() 函数中,我们传递需要转换的 ASCII 值。asciiVal.charCodeAt(0) 返回在 convertASCIItoHex() 函数中作为参数传递的输入值的 ASCII 码。ASCII 表包含到人类可读字母格式的映射以及与它们相关联的代码。它看起来像下面这样。
    十进制 十六进制代码 象征 描述
    65 41 一种 大写 A
    66 42 大写 B
    67 43 C 大写 C
    68 44 D 大写 D
    69 45 大写 E
    70 46 F 大写 F
    71 47 G 大写 G
    72 48 H 大写 H
    73 49 一世 大写 I
    74 4A J 大写 J
    十进制列表示 ASCII 值的代码。例如,A 的 ASCII 码是 65。函数 asciiVal.charCodeAt(0) 返回 asciiVal 的 ASCII 值,该值持有值 A。因此它返回 65。我们将 ASCII 代码存储在 asciiCode 变量中。
  • 一旦我们得到参数值对应的 ASCII 码,我们下一步就是将其转换为十六进制。在片段 asciiCode.toString(16) 中,.toString(16) 函数将十六进制值作为字符串返回。我们将十六进制字符串值存储在 hexValue 变量中。
  • 在最后一步,我们使用 JavaScript 的 console.log() 函数对传递的属性的十六进制等效项进行控制台。

笔记

  • 0x 关键字附加到转换后的十六进制值可能看起来很奇怪。javascript 中常用的方法是将数字标识为十六进制值(有关更多详细信息,请参阅 MSDN 文档)。为了你的业务目的,我们可以避免它并遵循 .toString(16) 函数输出的十六进制值。
  • toString(16) 函数是 JavaScript 中的多用途函数。我们可以用它来转换为不同的数基系统。我们需要将十进制基数或基数作为参数传递给函数。如果我们期待 ASCII 代码的二进制等价物,那么 toString(2) 函数将返回十进制值的二进制等价物。在返回二进制值之前,该函数会将对象类型转换为字符串。因此,.toString() 的返回类型是字符串。
  • 上面的代码只考虑了一种字符转换。因此,如果你提供一个字符串作为输入,例如 convertASCIItoHex("HELLO"),该函数将返回第一个字母 H 的十六进制值。它由 asciiVal.charCodeAt(0) 中的函数 charCode(0) 完成。

在 JavaScript 中将 ASCII 字符串转换为等效的十六进制

我们生活中比较常见的需求是将一个字符串作为一个整体转换成十六进制的等价值而不是一个字符。以下程序将一个字符串作为输入,并为每个字符返回一个等效的十六进制字符串作为输出。每个十六进制值将由 ' ' 分隔,以便更好地阅读和理解。

window.onload = function () {
    convertASCIItoHex("Hello!");
    convertASCIItoHex("Good Morning World!!");
}
function convertASCIItoHex(asciiString) {
    let hex = '';
    let tempASCII, tempHex;
    asciiString.split('').map( i => {
        tempASCII = i.charCodeAt(0)
        tempHex = tempASCII.toString(16);
        hex = hex + tempHex + ' ';
    });
    hex = hex.trim();
    console.log(hex);
}

输出:

48 65 6c 6c 6f 21
47 6f 6f 64 20 4d 6f 72 6e 69 6e 67 20 57 6f 72 6c 64 21 21

这里 convertASCIItoHex() 返回与提供的字符串输入相对应的十六进制字符串值。它将返回一个 String 类型的值。为了可读性和清晰度,十六进制代码字符串用空格分隔。让我们看看我们遵循的步骤。

  • 如上一节所述,我们调用 javascript 的 window.onload() 函数,然后通过传递字符串 "Hello!" 调用 convertASCIItoHex("Hello!") 函数作为它的参数。
  • convertASCIItoHex() 函数中,我们将输入字符串拆分为字符,以便于处理它们。因此,在这个阶段,"Hello!" 字符串转换为 ["H", "e", "l", "l", "o", "!"],一个字符串数组。
  • 接下来,我们使用 javascript 的 .map() 运算符对数组的每个元素应用 ASCII 到十六进制转换。它遍历每个元素并在每个元素上执行一个函数。我们将函数作为内联函数或箭头函数传递。
  • 在函数中,我们使用 charCodeAt(0) 来获取当前数组元素的 ASCII 码。然后,在 ASCII 代码对象上,我们应用 toString(16) 将 ASCII 值转换为十六进制基数。然后我们将十六进制值推送到 hex 数组,即输出数组。请注意,为了便于阅读,我们在连续转换之间使用了空格。你可能更喜欢使用 ,; 业务需要的分隔符。
  • 使用 hex = hex + tempHex + ' ' 我们在每个元素转换后附加一个空格。因此,最终结果将有一个尾随空格。为了删除它,我们使用了 javascript 的 .trim() 函数。
  • 最后,转换后的字符串数组通过 console.log(hex) 记录到控制台。

将十六进制转换回 ASCII

现在,当我们准备好十六进制值时,出现的问题是我们如何确认输出是否符合预期。我们使用 javascript 的 fromCharCode(ASCIICode) 函数实现了该功能的核心,该函数返回与传入参数的 ASCII 代码对应的 ASCII 字符。在这里,我们可以使用以下代码。

window.onload = function () {
    convertASCIItoHex("48 65 6c 6c 6f 21");
    convertASCIItoHex("47 6f 6f 64 20 4d 6f 72 6e 69 6e 67 20 57 6f 72 6c 64 21 21");
}
function convertHexToASCII(hexString) {
    let stringOut = '';
    hexString.split(' ').map( (i) => {
        tempAsciiCode = parseInt(i, 16);
        stringOut = stringOut + String.fromCharCode(tempAsciiCode);
    });
    console.log(stringOut);
}

输出:

Hello!
Good Morning World!!

一些方法在这里发挥了作用。parseInt(i, 16) 将基数 16 的输入转换为十进制基数。因此,使用这种方法,我们可以获得十六进制值的 ASCII 代码。而 String.fromCharCode(tempAsciiCode) 将作为参数传递给该函数的 ASCII 代码,并返回与该代码对应的 ASCII 字符。

评论

  • 最常用的人类可读形式的 ASCII 包括字母、数字和特殊字符。使用 javascript 代码,我们打算涵盖这些字符集。我们无法在 JavaScript 中测试某些 ASCII 代码,例如 ACK:确认字符、ETX:文本结束字符等。
  • 根据 ES8 标准,JavaScript 字符串变量最多可以容纳 253-1 个字符。这相当于 Chrome 中大约 512MB 的数据和 Firefox 中大约 1GB 的数据。因此,我们可以使用我们的代码转换更长的字符串值。