2024-08-26

冒泡排序、快速排序、归并排序和堆排序是四种常用的排序算法,以下是它们的Java实现:

冒泡排序:




public void bubbleSort(int[] arr) {
    int n = arr.length;
    for (int i = 0; i < n - 1; i++) {
        for (int j = 0; j < n - i - 1; j++) {
            if (arr[j] > arr[j + 1]) {
                // 交换 arr[j+1] 和 arr[j]
                int temp = arr[j];
                arr[j] = arr[j+1];
                arr[j+1] = temp;
            }
        }
    }
}

快速排序:




public void quickSort(int[] arr, int low, int high) {
    if (low < high) {
        // 获取分区后的枢纽位置
        int pivotIndex = partition(arr, low, high);
 
        // 分别对枢纽左右两边进行递归排序
        quickSort(arr, low, pivotIndex - 1);
        quickSort(arr, pivotIndex + 1, high);
    }
}
 
// 分区函数
private int partition(int[] arr, int low, int high) {
    // 选择一个枢纽元素,这里选择最高位作为枢纽
    int pivot = arr[high];
    int i = (low - 1);
    
    // 遍历数组,将小于枢纽的元素放到左边,大于枢纽的元素放到右边
    for (int j = low; j < high; j++) {
        if (arr[j] < pivot) {
            i++;
 
            // 交换 arr[i] 和 arr[j]
            int temp = arr[i];
            arr[i] = arr[j];
            arr[j] = temp;
        }
    }
 
    // 将枢纽元素放到正确的位置
    int temp = arr[i + 1];
    arr[i + 1] = arr[high];
    arr[high] = temp;
 
    return i + 1;
}

归并排序:




public void mergeSort(int[] arr, int low, int high) {
    if (low < high) {
        // 找到中间索引
        int mid = (low + high) / 2;
 
        // 对左边进行递归排序
        mergeSort(arr, low, mid);
 
        // 对右边进行递归排序
        mergeSort(arr, mid + 1, high);
 
        // 合并两个已排序的子数组
        merge(arr, low, mid, high);
    }
}
 
// 合并两个已排序的子数组
private void merge(int[] arr, int low, int mid, int high) {
    // 创建一个临时数组
    int[] temp = new int[high - low + 1];
    int i = low;
    int j = mid + 1;
    int k = 0;
 
    // 比较两个子数组,并将较小的元素放入临时数组中
    while (i <= mid && j <= high) {
        if (arr[i] <= arr[j]) {
            temp[k++] = arr[i++];
        } else {
            temp[k++]
2024-08-26

Collections.sort() 是 Java 集合框架中的一个静态方法,用于对 List 集合进行排序。该方法有多个重载版本,可以根据需要对自定义对象进行排序。

解决方案1:对于简单的数据类型,如 Integer,Double 等,可以直接使用 Collections.sort() 进行排序。




List<Integer> numbers = new ArrayList<Integer>();
numbers.add(3);
numbers.add(1);
numbers.add(4);
numbers.add(1);
Collections.sort(numbers);
System.out.println(numbers);  // 输出 [1, 1, 3, 4]

解决方案2:对于自定义对象,需要提供一个 Comparator 对象来指导排序。




class Person {
    String name;
    int age;
    // getters and setters
}
 
List<Person> people = new ArrayList<Person>();
people.add(new Person("John", 40));
people.add(new Person("Alice", 25));
people.add(new Person("Bob", 20));
 
Collections.sort(people, new Comparator<Person>() {
    public int compare(Person p1, Person p2) {
        return p1.getName().compareTo(p2.getName());
    }
});
 
// 或者使用 lambda 表达式简化
Collections.sort(people, (p1, p2) -> p1.getName().compareTo(p2.getName()));

解决方案3:如果需要对 List 进行逆序排序,可以使用 Comparator 接口的 reversed() 方法。




Collections.sort(people, Collections.reverseOrder());
// 或者
Collections.sort(people, (p1, p2) -> p2.getName().compareTo(p1.getName()));

解决方案4:从 Java 8 开始,可以使用 lambda 表达式或方法引用来简化代码。




Collections.sort(people, (p1, p2) -> Integer.compare(p1.getAge(), p2.getAge()));
// 或者
Collections.sort(people, Comparator.comparingInt(Person::getAge));

以上是 Collections.sort() 方法的几种常见用法,可以根据实际需求选择合适的方法进行使用。

2024-08-26



public class SortAlgorithms {
 
    // 交换数组中的两个元素
    private static void swap(int[] arr, int i, int j) {
        int temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }
 
    // 直接插入排序
    public static void insertionSort(int[] arr) {
        for (int i = 1; i < arr.length; i++) {
            for (int j = i; j > 0; j--) {
                if (arr[j] < arr[j - 1]) {
                    swap(arr, j, j - 1);
                }
            }
        }
    }
 
    // 冒泡排序
    public static void bubbleSort(int[] arr) {
        for (int i = 0; i < arr.length - 1; i++) {
            for (int j = 0; j < arr.length - i - 1; j++) {
                if (arr[j] > arr[j + 1]) {
                    swap(arr, j, j + 1);
                }
            }
        }
    }
 
    // 选择排序
    public static void selectionSort(int[] arr) {
        for (int i = 0; i < arr.length - 1; i++) {
            int minIndex = i;
            for (int j = i + 1; j < arr.length; j++) {
                if (arr[j] < arr[minIndex]) {
                    minIndex = j;
                }
            }
            swap(arr, i, minIndex);
        }
    }
 
    // 快速排序
    public static void quickSort(int[] arr, int low, int high) {
        if (low < high) {
            // 获取分区后的枢纽位置
            int pivotIndex = partition(arr, low, high);
            
            // 分别对枢纽左右两边进行递归排序
            quickSort(arr, low, pivotIndex - 1);
            quickSort(arr, pivotIndex + 1, high);
        }
    }
 
    private static int partition(int[] arr, int low, int high) {
        // 选择一个枢纽元素,这里选择最高位作为枢纽
        int pivot = arr[high];
        int i = (low - 1);
        
        // 遍历数组,将小于枢纽的元素放到左边,大于枢纽的元素放到右边
        for (int j = low; j < high; j++) {
            if (arr[j] < pivot) {
                i++;
 
                // 交换 arr[i] 和 arr[j]
                swap(arr, i, j);
            }
        }
        
        // 最后将枢纽元素放到正确的位置
        swap(arr, i + 1, high);
        
        return i + 1;
    }
 
    // 归并排序
    public static void mergeSort(int[] arr) {
        int mid = arr.length / 2;
        if (arr.length >= 2) {
            // 分割数组
            int[] leftHalf = Arrays.copyOfRange(arr, 0, mid);
            int[] rightHalf = Arrays.copyOfRange(arr, mid, arr.length);
 
            // 递归分割
            mergeSort(leftHalf);
            mergeSort(rightHalf);
 
            // 合并数组
  

在ElasticSearch中,我们可以使用sort参数来对查询结果进行排序。

以下是一些使用ElasticSearch的Java API进行查询排序的示例。

  1. 使用单个字段排序



SearchRequest searchRequest = new SearchRequest("index_name");
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
searchSourceBuilder.query(QueryBuilders.matchAllQuery());
searchSourceBuilder.sort("field_name", SortOrder.ASC);
searchRequest.source(searchSourceBuilder);
 
try {
    SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
    SearchHits searchHits = searchResponse.getHits();
    for (SearchHit hit : searchHits) {
        System.out.println(hit.getSourceAsString());
    }
} catch (IOException e) {
    e.printStackTrace();
}

在这个例子中,我们对"index\_name"索引的所有文档进行查询,并按照"field\_name"字段升序排序。

  1. 使用多个字段排序



SearchRequest searchRequest = new SearchRequest("index_name");
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
searchSourceBuilder.query(QueryBuilders.matchAllQuery());
searchSourceBuilder.sort("field_name1", SortOrder.ASC);
searchSourceBuilder.sort("field_name2", SortOrder.DESC);
searchRequest.source(searchSourceBuilder);
 
try {
    SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
    SearchHits searchHits = searchResponse.getHits();
    for (SearchHit hit : searchHits) {
        System.out.println(hit.getSourceAsString());
    }
} catch (IOException e) {
    e.printStackTrace();
}

在这个例子中,我们对"index\_name"索引的所有文档进行查询,并先按照"field\_name1"字段升序排序,若"field\_name1"字段值相同,则按照"field\_name2"字段降序排序。

  1. 使用脚本字段排序



SearchRequest searchRequest = new SearchRequest("index_name");
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
searchSourceBuilder.query(QueryBuilders.matchAllQuery());
searchSourceBuilder.sort(new ScriptSortBuilder(
    new Script(ScriptType.INLINE, "painless", "_value * doc['field_name'].value", Collections.emptyMap()),
    SortOrder.ASC)
);
searchRequest.source(searchSourceBuilder);
 
try {
    SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
    SearchHits searchHits = searchResponse.getHits();
    for (SearchHit hit : searc

在OpenCV中,我们可以通过以下方法将点的坐标按顺时针排序:

  1. 计算所有点的中心。
  2. 从最左边的点开始,按顺时针方向计算每个点与中心的角度,并排序。

以下是实现这一功能的Python代码:




import cv2
import numpy as np
 
def sort_points_clockwise(points):
    # 计算所有点的中心
    center = np.mean(points, axis=0)
    # 计算每个点与中心的角度并排序
    angles = np.arctan2(points[:, 1] - center[1], points[:, 0] - center[0])
    # 使角度从-π到π
    angles = (angles + np.pi) % (2 * np.pi) - np.pi
    # 按角度排序
    sorted_points = points[np.argsort(angles)]
    return sorted_points
 
# 示例使用
points = np.array([[100, 100], [200, 100], [200, 200], [100, 200]])
sorted_points = sort_points_clockwise(points)
 
# 打印排序后的点
print(sorted_points)

这段代码首先计算了所有点的中心,然后计算了每个点相对于中心的角度,并将角度调整到-π到π范围内,最后使用这些角度对点进行排序。排序后的点将按顺时针方向排列。

React Native Drag to Sort Tags 是一个用于在 React Native 应用程序中实现可排序标签的库。以下是如何使用该库的基本步骤:

  1. 安装库:



npm install react-native-drag-to-sort-tags

或者




yarn add react-native-drag-to-sort-tags
  1. 导入并使用组件:



import DraggableFlatList from 'react-native-drag-to-sort-tags';
 
export default function App() {
  const [tags, setTags] = React.useState([
    { id: 1, text: '标签1' },
    { id: 2, text: '标签2' },
    // ...更多标签
  ]);
 
  const renderItem = ({ item, index, drag, isActive }) => (
    <Tag
      key={item.id}
      text={item.text}
      active={isActive}
      onPress={() => alert(`你点击了标签: ${item.text}`)}
      drag={drag}
    />
  );
 
  return (
    <DraggableFlatList
      data={tags}
      renderItem={renderItem}
      onDragEnd={({ data }) => setTags(data)}
    />
  );
}
 
// 自定义标签组件
const Tag = ({ text, active, onPress, drag }) => (
  <TouchableOpacity onPress={onPress}>
    <View style={active ? styles.activeTag : styles.tag}>
      <Text>{text}</Text>
      {drag}
    </View>
  </TouchableOpacity>
);
 
const styles = StyleSheet.create({
  tag: {
    // 样式定义标签的基础样式
  },
  activeTag: {
    // 样式定义当标签被拖拽时的样式
  }
});

在这个例子中,我们创建了一个简单的标签列表,并使用 DraggableFlatList 组件允许用户通过拖放对它们进行排序。每个标签都是一个可拖动的项目,并且可以通过点击触发事件。当拖动结束时,onDragEnd 回调函数更新标签列表的状态,以保存新的排序。

2024-08-23

在JavaScript中,push(), pop(), unshift(), shift(), reverse() 都是数组对象的方法,这些方法可以用于操作HTML DOM元素的CSS类名。

  1. push() 方法:向数组的末尾添加一个或多个元素,并返回新的长度。



let arr = [1, 2, 3];
arr.push(4);
console.log(arr); // 输出:[1, 2, 3, 4]
  1. pop() 方法:删除数组的最后一个元素并返回该元素。



let arr = [1, 2, 3];
arr.pop();
console.log(arr); // 输出:[1, 2]
  1. unshift() 方法:向数组的开头添加一个或多个元素,并返回新的长度。



let arr = [1, 2, 3];
arr.unshift(0);
console.log(arr); // 输出:[0, 1, 2, 3]
  1. shift() 方法:删除数组的第一个元素并返回该元素。



let arr = [1, 2, 3];
arr.shift();
console.log(arr); // 输出:[2, 3]
  1. reverse() 方法:颠倒数组中元素的顺序。



let arr = [1, 2, 3];
arr.reverse();
console.log(arr); // 输出:[3, 2, 1]

在前端开发中,我们经常需要操作DOM元素的CSS类名。以下是一个示例,展示如何使用JavaScript中的数组方法来操作DOM元素的CSS类名:




<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Example</title>
<style>
.red { color: red; }
.blue { color: blue; }
</style>
</head>
<body>
 
<h1 id="myHeading">Hello World!</h1>
 
<script>
// 获取元素
var element = document.getElementById('myHeading');
 
// 获取当前类名
var classNames = element.className.split(/\s+/);
 
// 添加一个类名
classNames.push('blue');
 
// 移除一个类名
classNames = classNames.filter(function(c) { return c !== 'red'; });
 
// 应用新的类名
element.className = classNames.join(' ');
</script>
 
</body>
</html>

在这个例子中,我们首先获取了一个DOM元素,然后使用split()方法将类名分割成数组。接着,我们使用push()添加了一个新的类名,并使用filter()移除了一个旧的类名。最后,我们使用join(' ')将数组中的类名重新合并为一个字符串,并将其赋值给元素的className属性。这样就可以实现对DOM元素CSS类名的动态管理。

2024-08-22

在JavaScript中,你可以使用Array.prototype.sort()方法来根据数组中的元素值进行排序。如果你想根据对象数组中的特定属性值排序,你可以传递一个比较函数给sort方法。

以下是一个示例,演示如何根据对象数组中的age属性值对数组进行排序:




let users = [
  { name: 'John', age: 25 },
  { name: 'Jane', age: 20 },
  { name: 'Bob', age: 30 }
];
 
// 按年龄升序排序
users.sort((a, b) => a.age - b.age);
 
console.log(users);
// 输出: [ { name: 'Jane', age: 20 }, { name: 'John', age: 25 }, { name: 'Bob', age: 30 } ]
 
// 按年龄降序排序
users.sort((a, b) => b.age - a.age);
 
console.log(users);
// 输出: [ { name: 'Bob', age: 30 }, { name: 'John', age: 25 }, { name: 'Jane', age: 20 } ]

在比较函数中,你可以通过ab来比较数组元素,并返回一个负数、零或正数来指示排序顺序。返回负数(或true)表示ab之前,返回正数(或true)表示ab之后,返回零(或false)表示ab的顺序不变。

2024-08-21
  1. push() - 在数组末尾添加一个或多个元素,并返回新的长度。



let arr = [1, 2, 3];
let newLength = arr.push(4, 5);
console.log(arr); // 输出:[1, 2, 3, 4, 5]
console.log(newLength); // 输出:5
  1. pop() - 删除数组的最后一个元素,并返回那个元素。



let arr = [1, 2, 3];
let lastElement = arr.pop();
console.log(arr); // 输出:[1, 2]
console.log(lastElement); // 输出:3
  1. unshift() - 在数组开始添加一个或多个元素,并返回新的长度。



let arr = [3, 4, 5];
let newLength = arr.unshift(1, 2);
console.log(arr); // 输出:[1, 2, 3, 4, 5]
console.log(newLength); // 输出:5
  1. shift() - 删除数组的第一个元素,并返回那个元素。



let arr = [1, 2, 3];
let firstElement = arr.shift();
console.log(arr); // 输出:[2, 3]
console.log(firstElement); // 输出:1
  1. splice() - 通过删除现有元素和/或添加新元素来更改一个数组的内容。



let arr = [1, 2, 3, 4, 5];
let removedElements = arr.splice(2, 3, 'a', 'b'); // 从索引2开始,删除3个元素,并添加'a'和'b'
console.log(arr); // 输出:[1, 2, 'a', 'b', 5]
console.log(removedElements); // 输出:[3, 4, 5]
  1. slice() - 返回一个新的数组对象,这个对象是一个由原数组的一部分组成的浅拷贝,从原数组中提取开始到结束(不包括结束)的部分形成新数组。



let arr = [1, 2, 3, 4, 5];
let newArr = arr.slice(2, 4);
console.log(newArr); // 输出:[3, 4]
  1. co - 是一个生成器的语法糖,它允许你以更简洁的方式编写生成器。



// 使用co之前
let fs = require('fs');
let co = require('co');
 
co(function *(){
  let fd = yield fs.open('path/to/file', 'w');
  yield fs.write(fd, 'Hello World!', 0);
  yield fs.close(fd);
}).then(() => {
  console.log('File written!');
}).catch(err => {
  console.error('Error: ', err);
});
 
// 使用co之后
const co = require('co');
const fs = require('fs').promises;
 
co(async () => {
  let fd = await fs.open('path/to/file', 'w');
  await fs.write(fd, 'Hello World!', 0);
  await fs.close(fd);
}).then(() => {
  console.log('File written!');
}).catch(err => {
  console.error('Error: ', err);
});

以上是对JS数组常用方法的详细解释和示例。

2024-08-20

Sortable.js 是一个用于Web上的开源拖放库,它允许用户以简单的方式对任何列表进行排序。Sortable.js 可以和任何框架一起工作,并且支持触摸设备和所有现代浏览器。

以下是一个使用Sortable.js的基本示例:

  1. 首先,在HTML文件中引入Sortable.js库:



<script src="https://cdnjs.cloudflare.com/ajax/libs/Sortable.js/1.14.0/Sortable.min.js"></script>
  1. 接着,创建一个可排序的列表:



<ul id="items">
  <li>Item 1</li>
  <li>Item 2</li>
  <li>Item 3</li>
</ul>
  1. 最后,使用JavaScript代码初始化Sortable:



var el = document.getElementById('items');
var sortable = new Sortable(el, {
  animation: 150, // 动画持续时间,单位毫秒
  onEnd: function (evt) {
    // 排序结束后的回调函数
    console.log('Moved from ' + evt.oldIndex + ' to ' + evt.newIndex);
  }
});

这个例子中,我们创建了一个可以拖拽排序的列表,并通过Sortable.js库使其具备排序功能。在排序结束后,我们打印出了移动前后的索引位置。

Sortable.js 提供了许多选项和事件处理函数,可以帮助你定制排序功能以满足特定需求。