2024-08-14

JavaScript中的Set是一种新的原生集合类型,类似于数组,但只能有唯一的值。

以下是一些Set的常用方法和操作:

  1. 创建Set



let s = new Set();
  1. 添加元素



s.add(1);
s.add("hello");
  1. 删除元素



s.delete(1);
  1. 检查元素是否存在



s.has(1); // false
  1. 清空Set



s.clear();
  1. 获取Set的长度



s.size;
  1. 遍历Set



for (let item of s) {
    console.log(item);
}
  1. 使用Array去重



let arr = [1, 2, 3, 2, 4, 1];
let unique = [...new Set(arr)];
  1. 交集、并集、差集操作



let setA = new Set([1, 2, 3]);
let setB = new Set([2, 3, 4]);
 
// 并集
let union = new Set([...setA, ...setB]);
 
// 交集
let intersect = new Set([...setA].filter(x => setB.has(x)));
 
// 差集
let difference = new Set([...setA].filter(x => !setB.has(x)));

以上是Set的基本操作和使用方法,Set是一种新的数据结构,可以用于解决一些实际问题,例如,数组去重、数据的交集、并集、差集等操作。

2024-08-13

在Java中,PriorityQueue是一个基于堆实现的无界队列。每次从队列中提取元素都是提取最小(或最大)元素,这就是为什么它被称为优先级队列。

下面是如何使用PriorityQueue的示例代码:




import java.util.PriorityQueue;
 
public class PriorityQueueExample {
    public static void main(String[] args) {
        PriorityQueue<Integer> priorityQueue = new PriorityQueue<>();
 
        // 添加元素
        priorityQueue.offer(30);
        priorityQueue.offer(10);
        priorityQueue.offer(20);
 
        // 查看队首元素
        System.out.println("Front element: " + priorityQueue.peek()); // 输出:Front element: 10
 
        // 移除并返回队首元素
        System.out.println("Removed element: " + priorityQueue.poll()); // 输出:Removed element: 10
 
        // 判断队列是否为空
        System.out.println("Is queue empty? " + priorityQueue.isEmpty()); // 输出:Is queue empty? false
 
        // 清空队列
        priorityQueue.clear();
        System.out.println("Is queue empty after clearing? " + priorityQueue.isEmpty()); // 输出:Is queue empty after clearing? true
    }
}

在上述代码中,我们创建了一个PriorityQueue,向其中添加了几个整数。我们使用peek()方法来查看队首元素,使用poll()方法来移除并返回队首元素。我们还检查了队列是否为空,并清空了队列。

堆(Heap)是一个具有特殊属性的完全二叉树:每个节点的值都大于或等于(或小于或等于)其子节点的值,称为最大堆或最小堆。在Java中,PriorityQueue内部就是通过堆来实现的。

堆通常用于实现优先队列,还可以用于排序等操作。但是,在Java的标准库中,堆的直接操作相对较少,因为PriorityQueue已经提供了相同的功能,并且使用更方便。因此,在实际编程中,堆的直接操作通常会使用PriorityQueue

2024-08-13

ArrayList是Java集合框架中的一部分,是一种可动态增长和减小的数组。

以下是一些常用的ArrayList方法:

  1. 添加元素:



ArrayList<String> arrayList = new ArrayList<>();
arrayList.add("Apple");
arrayList.add("Banana");
  1. 在指定位置添加元素:



arrayList.add(1, "Orange");
  1. 删除元素:



arrayList.remove("Apple");
  1. 在指定位置删除元素:



arrayList.remove(1);
  1. 修改元素:



arrayList.set(1, "Mango");
  1. 获取元素:



String fruit = arrayList.get(1);
  1. 获取ArrayList大小:



int size = arrayList.size();
  1. 判断ArrayList是否为空:



boolean isEmpty = arrayList.isEmpty();
  1. 清空ArrayList:



arrayList.clear();
  1. 遍历ArrayList:



for (String fruit : arrayList) {
    System.out.println(fruit);
}

或者使用迭代器:




Iterator<String> iterator = arrayList.iterator();
while (iterator.hasNext()) {
    System.out.println(iterator.next());
}

这些是ArrayList的基本操作,具体使用时可以根据需要选择相应的方法。

2024-08-12

栈(Stack)是一种线性数据结构,遵循后进先出(LIFO)原则。在Java中,我们可以使用标准库中的Stack类,也可以自己实现一个栈。以下是一个简单的自定义栈的示例:




public class MyStack<T> {
    private List<T> list;
 
    public MyStack() {
        list = new ArrayList<>();
    }
 
    // 入栈
    public void push(T item) {
        list.add(item);
    }
 
    // 出栈
    public T pop() {
        if (list.isEmpty()) {
            return null;
        }
        return list.remove(list.size() - 1);
    }
 
    // 查看栈顶元素
    public T peek() {
        if (list.isEmpty()) {
            return null;
        }
        return list.get(list.size() - 1);
    }
 
    // 判断栈是否为空
    public boolean isEmpty() {
        return list.isEmpty();
    }
}
 
// 使用示例
public class StackExample {
    public static void main(String[] args) {
        MyStack<Integer> stack = new MyStack<>();
 
        // 入栈
        stack.push(1);
        stack.push(2);
        stack.push(3);
 
        // 查看栈顶元素
        System.out.println("栈顶元素: " + stack.peek()); // 输出: 栈顶元素: 3
 
        // 出栈两次
        stack.pop();
        stack.pop();
 
        // 再次查看栈顶元素
        System.out.println("栈顶元素: " + stack.peek()); // 输出: 栈顶元素: 1
 
        // 判断栈是否为空
        System.out.println("栈是否为空: " + stack.isEmpty()); // 输出: 栈是否为空: false
    }
}

在这个示例中,我们定义了一个泛型类MyStack,它具有入栈(push)、出栈(pop)、查看栈顶元素(peek)以及判断栈是否为空(isEmpty)的基本操作。然后,我们创建了一个StackExample类来演示如何使用MyStack

2024-08-11



package main
 
import (
    "fmt"
    "github.com/emirpasic/gods"
    "github.com/emirpasic/gods/lists/singlylinkedlist"
)
 
func main() {
    // 创建一个单向链表
    list := singlylinkedlist.New()
 
    // 往链表中添加元素
    list.Add(1)
    list.Add("a")
    list.Add(2)
    list.Add("b")
 
    // 遍历链表并打印元素
    for i := 0; i < list.Size(); i++ {
        fmt.Println(list.Value(i))
    }
 
    // 使用迭代器来遍历链表
    iterator := list.Iterator()
    for iterator.Next() {
        fmt.Println(iterator.Value())
    }
}

这段代码演示了如何使用singlylinkedlist库创建一个单向链表,并展示了如何添加元素、遍历链表以及使用迭代器进行遍历。这是一个简单的数据结构示例,对于学习Go语言中的算法和数据结构有很好的教育意义。

2024-08-11

以下是一个简单的Java代码示例,演示了如何初始化一个线性表的链表结构,并添加一个元素。




class Node<T> {
    T data;
    Node<T> next;
 
    public Node(T data) {
        this.data = data;
        this.next = null;
    }
}
 
public class LinkedList<T> {
    private Node<T> head;
 
    public LinkedList() {
        head = null;
    }
 
    public void add(T data) {
        Node<T> newNode = new Node<>(data);
        if (head == null) {
            head = newNode;
        } else {
            Node<T> current = head;
            while (current.next != null) {
                current = current.next;
            }
            current.next = newNode;
        }
    }
 
    // 其他方法,例如打印链表、插入节点、删除节点等
}
 
public class Main {
    public static void main(String[] args) {
        LinkedList<Integer> linkedList = new LinkedList<>();
        linkedList.add(1); // 添加元素1到链表
        // 此处可以添加更多的方法调用来演示其他功能
    }
}

这个示例定义了一个泛型的Node类来表示链表节点,以及一个LinkedList类,它有一个head节点作为链表的开始,并且有一个add方法来向链表添加新的节点。在main方法中,我们创建了一个LinkedList实例,并向其添加了一个整数1。这个简单的示例展示了如何初始化一个链表并添加元素。

2024-08-11



/* 设置一个容器使用伸缩布局 */
.container {
  display: flex; /* 设置为伸缩容器 */
  flex-direction: row; /* 设置主轴方向为水平 */
  justify-content: flex-start; /* 项目沿主轴起始端对齐 */
  align-items: center; /* 项目沿交叉轴居中对齐 */
  height: 100px; /* 设置容器高度 */
  background-color: #f0f0f0; /* 设置背景色 */
}
 
/* 设置伸缩项目 */
.item {
  flex: 1; /* 项目占据等分的空间 */
  margin: 8px; /* 项目之间的间隔 */
  text-align: center; /* 文字居中对齐 */
}
 
/* 设置特定项目的样式 */
.item:first-child {
  flex-grow: 2; /* 第一个项目的放大比例是其他项目的两倍 */
  background-color: #ffcccc; /* 设置背景色 */
}
 
.item:last-child {
  flex-basis: 150px; /* 最后一个项目的基准宽度 */
  background-color: #ccffcc; /* 设置背景色 */
}

这段代码展示了如何使用CSS的伸缩布局(flexbox)来创建一个简单的水平排列的容器,其中包含三个伸缩项目。第一个项目比其他项目大两倍,最后一个项目有一个固定宽度。这是一个很好的入门级示例,展示了伸缩布局的基本属性和概念。

2024-08-10

在Java中,TreeSet和TreeMap都是基于红黑树(Red-Black tree)的实现。它们都能够确保元素的排列顺序,并且能够保证元素的唯一性。

TreeSet:

  • 底层数据结构是红黑树,确保元素唯一性,且元素按照自然排序进行排列。
  • 不允许null值。
  • 实现了Set接口。

TreeMap:

  • 底层数据结构是红黑树,保证键的唯一性,且键按照自然排序进行排列。
  • 不允许null作为键和值。
  • 实现了Map接口。

以下是TreeSet和TreeMap的简单示例代码:




import java.util.TreeSet;
import java.util.TreeMap;
 
public class TreeExample {
    public static void main(String[] args) {
        // TreeSet示例
        TreeSet<Integer> treeSet = new TreeSet<>();
        treeSet.add(10);
        treeSet.add(5);
        treeSet.add(15);
        treeSet.add(3);
        treeSet.add(7);
 
        for (Integer number : treeSet) {
            System.out.println(number);
        }
 
        // TreeMap示例
        TreeMap<String, Integer> treeMap = new TreeMap<>();
        treeMap.put("Alice", 30);
        treeMap.put("Bob", 20);
        treeMap.put("Charlie", 10);
 
        for (String key : treeMap.keySet()) {
            System.out.println(key + ": " + treeMap.get(key));
        }
    }
}

在这个例子中,TreeSet自动排列了添加的整数,TreeMap按照键(这里是String)进行排列,并存储对应的值(这里是整数)。

2024-08-10

以下是一个简单的栈和队列的Java实现示例:




// 栈的实现
class Stack<T> {
    private java.util.List<T> list = new ArrayList<>();
 
    public void push(T item) {
        list.add(item);
    }
 
    public T pop() {
        if (list.isEmpty()) {
            return null;
        }
        return list.remove(list.size() - 1);
    }
 
    public T peek() {
        if (list.isEmpty()) {
            return null;
        }
        return list.get(list.size() - 1);
    }
 
    public boolean isEmpty() {
        return list.isEmpty();
    }
}
 
// 队列的实现
class Queue<T> {
    private java.util.List<T> list = new ArrayList<>();
 
    public void enqueue(T item) {
        list.add(item);
    }
 
    public T dequeue() {
        if (list.isEmpty()) {
            return null;
        }
        return list.remove(0);
    }
 
    public T peek() {
        if (list.isEmpty()) {
            return null;
        }
        return list.get(0);
    }
 
    public boolean isEmpty() {
        return list.isEmpty();
    }
}
 
// 测试代码
public class Main {
    public static void main(String[] args) {
        Stack<Integer> stack = new Stack<>();
        Queue<Integer> queue = new Queue<>();
 
        // 栈操作
        stack.push(1);
        stack.push(2);
        System.out.println(stack.peek()); // 输出: 2
        System.out.println(stack.pop());  // 输出: 2
 
        // 队列操作
        queue.enqueue(1);
        queue.enqueue(2);
        System.out.println(queue.peek()); // 输出: 1
        System.out.println(queue.dequeue()); // 输出: 1
    }
}

这个示例提供了栈和队列的简单实现,并在主函数中演示了如何使用它们。栈支持push, pop和peek操作,而队列支持enqueue, dequeue和peek操作。这些操作对应于线性表的栈和队列的基本操作。

2024-08-10

泛型是Java中一个重要的部分,它允许在定义类或者方法时使用类型变量,这个类型变量可以在声明变量、创建对象、调用方法的时候才明确指定。

泛型的主要目的是为了创建可以按类型进行参数化的类或者方法,泛型的类或者方法可以以一种灵活的方式实现,而不需要进行类型转换。

下面是一个简单的泛型类的例子:




public class Box<T> {
    private T t;
 
    public Box(T t) {
        this.t = t;
    }
 
    public void set(T t) {
        this.t = t;
    }
 
    public T get() {
        return t;
    }
}

在这个例子中,T 是一个类型变量,它代表了一个未知的类型。当创建 Box 类的实例时,我们可以指定这个类型变量的具体类型:




Box<Integer> integerBox = new Box<>(10);
Box<String> stringBox = new Box<>("Hello");
 
System.out.println(integerBox.get()); // 输出 10
System.out.println(stringBox.get());  // 输出 Hello

泛型也可以用在方法上,例如:




public class Util {
    public static <T> void printArray(T[] array) {
        for (T element : array) {
            System.out.println(element);
        }
    }
}

在这个例子中,<T> 表示这是一个泛型方法,它可以接受任何类型的数组。

泛型还可以有多个类型变量,例如:




public class Pair<T, U> {
    private T first;
    private U second;
 
    public Pair(T first, U second) {
        this.first = first;
        this.second = second;
    }
 
    public T getFirst() {
        return first;
    }
 
    public U getSecond() {
        return second;
    }
}

在这个例子中,Pair 类接受两个不同的类型参数 TU

泛型的一个重要好处是类型检查,它可以在编译时而不是运行时检查类型安全,这可以帮助我们在编程时减少错误。