优秀的开发者不仅要掌握语言本身,更要熟悉各种开发工具和编程技巧。本文汇集了多种语言的实用技巧和工具,帮助你提升开发效率和代码质量。
JavaScript实用技巧
数组操作
基本排序
// 数字数组排序(从小到大)
function compare(num1, num2) {
return num1 - num2;
}
var nums = [3, 1, 2, 100, 4, 200];
nums.sort(compare);
console.log(nums); // [1, 2, 3, 4, 100, 200]
// 从大到小排序
function compareDesc(num1, num2) {
return num2 - num1;
}
nums.sort(compareDesc);
console.log(nums); // [200, 100, 4, 3, 2, 1]
注意:JavaScript的sort()方法默认将元素转换为字符串排序,所以对数字需要自定义比较函数。
迭代器方法
// map:创建新数组
function first(word) {
return word[0];
}
var words = ["for", "your", "info"];
var acronym = words.map(first);
console.log(acronym.join("")); // "fyi"
// 数值计算
var numbers = [1, 2, 3, 4, 5];
var doubled = numbers.map(x => x * 2);
console.log(doubled); // [2, 4, 6, 8, 10]
filter过滤
// 筛选及格成绩
function passing(num) {
return num >= 60;
}
var grades = [];
for (var i = 0; i < 20; i++) {
grades[i] = Math.floor(Math.random() * 101);
}
var passGrades = grades.filter(passing);
console.log("全部成绩:", grades);
console.log("及格成绩:", passGrades);
// 筛选偶数
var nums = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
var evens = nums.filter(n => n % 2 === 0);
console.log(evens); // [2, 4, 6, 8, 10]
reduce累加
// 数组求和
var numbers = [1, 2, 3, 4, 5];
var sum = numbers.reduce((total, num) => total + num, 0);
console.log(sum); // 15
// 数组最大值
var max = numbers.reduce((a, b) => Math.max(a, b));
console.log(max); // 5
// 统计字符出现次数
var str = "hello world";
var charCount = str.split('').reduce((count, char) => {
count[char] = (count[char] || 0) + 1;
return count;
}, {});
console.log(charCount); // {h: 1, e: 1, l: 3, o: 2, ' ': 1, w: 1, r: 1, d: 1}
some和every
// some:是否存在满足条件的元素
var numbers = [1, 2, 3, 4, 5];
var hasEven = numbers.some(n => n % 2 === 0);
console.log(hasEven); // true
// every:是否所有元素都满足条件
var allPositive = numbers.every(n => n > 0);
console.log(allPositive); // true
var allGreaterThanThree = numbers.every(n => n > 3);
console.log(allGreaterThanThree); // false
forEach遍历
var colors = ["red", "green", "blue"];
colors.forEach((color, index) => {
console.log(`${index}: ${color}`);
});
// 输出:
// 0: red
// 1: green
// 2: blue
二维数组操作
计算学生平均分
// 计算每个学生的平均分
var grades = [
[89, 77, 78],
[76, 82, 81],
[91, 94, 89]
];
var total = 0;
var average = 0.0;
for (var row = 0; row < grades.length; row++) {
for (var col = 0; col < grades[row].length; col++) {
total += grades[row][col];
}
average = total / grades[row].length;
console.log("Student " + (row + 1) + " average: " + average.toFixed(2));
total = 0;
average = 0.0;
}
// 输出:
// Student 1 average: 81.33
// Student 2 average: 79.67
// Student 3 average: 91.33
计算科目平均分
// 计算每门考试的平均分
var grades = [
[89, 77, 78],
[76, 82, 81],
[91, 94, 89]
];
var total = 0;
var average = 0.0;
for (var col = 0; col < grades[0].length; col++) {
for (var row = 0; row < grades.length; row++) {
total += grades[row][col];
}
average = total / grades.length;
console.log("Test " + (col + 1) + " average: " + average.toFixed(2));
total = 0;
average = 0.0;
}
// 输出:
// Test 1 average: 85.33
// Test 2 average: 84.33
// Test 3 average: 82.67
对象操作
按键排序对象
// 按对象的某个键排序
var obj = [
{name: "Alice", age: 25},
{name: "Bob", age: 20},
{name: "Charlie", age: 30}
];
obj.sort((a, b) => a.age - b.age);
console.log(obj);
// [
// {name: "Bob", age: 20},
// {name: "Alice", age: 25},
// {name: "Charlie", age: 30}
// ]
对象解构
// 解构赋值
var person = {name: "Alice", age: 25, city: "New York"};
var {name, age} = person;
console.log(name); // "Alice"
console.log(age); // 25
// 嵌套解构
var data = {
user: {
name: "Bob",
address: {
city: "Boston"
}
}
};
var {user: {address: {city}}} = data;
console.log(city); // "Boston"
jQuery实用技巧
jQuery是与否
// 检查jQuery是否加载
if (typeof jQuery === 'undefined') {
console.log('jQuery not loaded');
} else {
console.log('jQuery loaded');
}
// 检查元素是否存在
if ($('#myElement').length) {
console.log('Element exists');
}
jQuery引入方式
<!-- 方式1:从CDN引入 -->
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
<!-- 方式2:本地文件 -->
<script src="/js/jquery-3.6.0.min.js"></script>
<!-- 方式3:使用包管理器 -->
<!-- npm install jquery -->
<script src="./node_modules/jquery/dist/jquery.min.js"></script>
<!-- 方式4:RequireJS -->
<script>
require(['jquery'], function($) {
$(document).ready(function() {
console.log('jQuery loaded via RequireJS');
});
});
</script>
Python数据结构与算法
链表实现
基础链表
class Node:
def __init__(self, value):
self.value = value
self.next = None
def __str__(self):
return str(self.value)
class LinkedList:
def __init__(self):
self.head = None
self.tail = None
def addNode(self, value):
node = Node(value)
if self.head is None:
self.head = node
self.tail = node
else:
self.tail.next = node
self.tail = node
def __str__(self):
if self.head is not None:
index = self.head
nodeStore = [str(index.value)]
while index.next is not None:
index = index.next
nodeStore.append(str(index.value))
return "LinkedList [ " + "->".join(nodeStore) + " ]"
return "LinkedList []"
def generateLinkedList(numArray):
linkedlist = LinkedList()
for i in range(len(numArray)):
linkedlist.addNode(numArray[i])
return linkedlist
# 使用示例
list1 = generateLinkedList([2, 4, 3])
print(list1) # LinkedList [ 2->4->3 ]
链表相加
class ListsSum:
def addLists(self, l1, l2):
p1 = l1.head
p2 = l2.head
carry = 0
linkedlist_sum = LinkedList()
while (p1 is not None) or (p2 is not None) or (carry != 0):
dig_sum = carry
if p1 is not None:
dig_sum += p1.value
p1 = p1.next
if p2 is not None:
dig_sum += p2.value
p2 = p2.next
linkedlist_sum.addNode(dig_sum % 10)
carry = dig_sum // 10
return linkedlist_sum
# 使用示例
solution = ListsSum()
list1 = generateLinkedList([2, 4, 3]) # 342
list2 = generateLinkedList([5, 6, 4]) # 465
print(solution.addLists(list1, list2)) # 807: LinkedList [ 7->0->8 ]
栈的实现
class Stack:
def __init__(self):
self.items = []
def push(self, item):
self.items.append(item)
def pop(self):
if not self.is_empty():
return self.items.pop()
def is_empty(self):
return len(self.items) == 0
def peek(self):
if not self.is_empty():
return self.items[-1]
def size(self):
return len(self.items)
# 使用示例
stack = Stack()
stack.push(1)
stack.push(2)
stack.push(3)
print(stack.pop()) # 3
print(stack.peek()) # 2
print(stack.size()) # 2
算法实践技巧
Java算法练习提示
- 使用Scanner处理输入
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
String str = scanner.nextLine();
- 数组初始化技巧
// 动态数组
ArrayList<Integer> list = new ArrayList<>();
// 固定大小数组
int[] arr = new int[n];
// 二维数组
int[][] matrix = new int[m][n];
- 常用工具方法
// 数组排序
Arrays.sort(arr);
// 数组转字符串
Arrays.toString(arr);
// 填充数组
Arrays.fill(arr, value);
Perl技巧集锦
Perl One-Liners
文本处理
# 删除重复行
perl -ne 'print unless $a{$_}++' file.txt
# 查找重复行
perl -ne 'print if $a{$_}++' file.txt
# 添加行号
perl -ne 'print "$. $_"' file.txt
# 反转行顺序
perl -e 'print reverse <>' file.txt
# 随机排序行
perl -e 'print shuffle <>' file.txt
数值计算
# 计算列的总和
perl -lane '$sum += $F[0]; END { print $sum }' file.txt
# 计算平均值
perl -lane '$sum += $F[0]; $count++; END { print $sum/$count }' file.txt
# 查找最大值
perl -lane '$max = $F[0] if !defined $max || $F[0] > $max; END { print $max }' file.txt
Perl高级特性
静态变量
# 使用state定义静态变量(Perl 5.10+)
use feature 'state';
sub counter {
state $count = 0;
return ++$count;
}
print counter(); # 1
print counter(); # 2
print counter(); # 3
# 老版本方法
sub counter_old {
my $count;
$count ||= 0;
return ++$count;
}
匿名子例程
# 创建闭包
sub create_counter {
my $count = 0;
return sub {
return ++$count;
};
}
my $counter1 = create_counter();
my $counter2 = create_counter();
print $counter1->(); # 1
print $counter1->(); # 2
print $counter2->(); # 1
数据结构实现对比
链表的多种实现
Perl链表实现
package LinkedList;
sub new {
my $class = shift;
my $self = {
head => undef,
tail => undef,
};
bless $self, $class;
return $self;
}
sub add_node {
my ($self, $value) = @_;
my $node = {value => $value, next => undef};
if (!defined $self->{head}) {
$self->{head} = $node;
$self->{tail} = $node;
} else {
$self->{tail}{next} = $node;
$self->{tail} = $node;
}
}
C链表实现
typedef struct Node {
int value;
struct Node* next;
} Node;
typedef struct LinkedList {
Node* head;
Node* tail;
} LinkedList;
void addNode(LinkedList* list, int value) {
Node* node = (Node*)malloc(sizeof(Node));
node->value = value;
node->next = NULL;
if (list->head == NULL) {
list->head = node;
list->tail = node;
} else {
list->tail->next = node;
list->tail = node;
}
}
线性表的顺序存储
指针实现(动态数组)
typedef struct {
int* data;
int length;
int capacity;
} SeqList;
void initList(SeqList* list, int capacity) {
list->data = (int*)malloc(sizeof(int) * capacity);
list->length = 0;
list->capacity = capacity;
}
void insert(SeqList* list, int index, int value) {
if (index < 0 || index > list->length) {
return; // 索引越界
}
if (list->length >= list->capacity) {
// 扩容
int newCapacity = list->capacity * 2;
int* newData = (int*)realloc(list->data, sizeof(int) * newCapacity);
if (newData) {
list->data = newData;
list->capacity = newCapacity;
}
}
// 移动元素
for (int i = list->length; i > index; i--) {
list->data[i] = list->data[i - 1];
}
list->data[index] = value;
list->length++;
}
引用实现(智能指针)
#include <memory>
#include <vector>
class SmartList {
private:
std::shared_ptr<std::vector<int>> data;
public:
SmartList() : data(std::make_shared<std::vector<int>>()) {}
void insert(int index, int value) {
if (index >= 0 && index <= data->size()) {
data->insert(data->begin() + index, value);
}
}
int get(int index) const {
if (index >= 0 && index < data->size()) {
return (*data)[index];
}
return -1; // 或抛出异常
}
int size() const {
return data->size();
}
};
二叉树遍历
递归实现
class TreeNode:
def __init__(self, value):
self.value = value
self.left = None
self.right = None
def preorder_traversal(node):
"""前序遍历:根-左-右"""
if node:
print(node.value)
preorder_traversal(node.left)
preorder_traversal(node.right)
def inorder_traversal(node):
"""中序遍历:左-根-右"""
if node:
inorder_traversal(node.left)
print(node.value)
inorder_traversal(node.right)
def postorder_traversal(node):
"""后序遍历:左-右-根"""
if node:
postorder_traversal(node.left)
postorder_traversal(node.right)
print(node.value)
非递归实现(使用栈)
def preorder_iterative(root):
"""前序遍历非递归实现"""
if not root:
return
stack = [root]
while stack:
node = stack.pop()
print(node.value)
# 先右后左,保证左子树先处理
if node.right:
stack.append(node.right)
if node.left:
stack.append(node.left)
def inorder_iterative(root):
"""中序遍历非递归实现"""
stack = []
current = root
while current or stack:
# 到达最左节点
while current:
stack.append(current)
current = current.left
current = stack.pop()
print(current.value)
current = current.right
实用编程技巧
文件批量操作
Perl批量重命名
use strict;
use warnings;
use Cwd;
my $target_dir = getcwd();
opendir(my $dh, $target_dir) || die "can't opendir $target_dir: $!";
my @files = grep { /\w/ && -f "$_" && !/^\./ } readdir($dh);
for (@files) {
my $file = $_;
# 示例:[Alex_Holmes]_Hadoop_in_Practice(BookZZ.org).pdf
# 转换为:Hadoop_in_Practice.pdf
if (/^(?:\[[\S\s]+\])([\S\s]+)(?:\([\S\s]+\))\.pdf$/) {
my $new_name = $1 . ".pdf";
rename($file, $new_name) || die("error in renaming: $!");
}
}
Python批量操作
import os
import re
def batch_rename(directory):
pattern = re.compile(r'\[.*?\](.*?)\(.*?\)\.pdf$')
for filename in os.listdir(directory):
match = pattern.match(filename)
if match:
new_name = match.group(1) + '.pdf'
old_path = os.path.join(directory, filename)
new_path = os.path.join(directory, new_name)
os.rename(old_path, new_path)
print(f"Renamed: {filename} -> {new_name}")
batch_rename('.')
文本处理技巧
删除^M字符
# Vim中删除DOS换行符
:%s/^M//g
# ^M输入方法:Ctrl+V,然后Enter
# Perl脚本删除^M并删除注释
open($IN, $ARGV[0]) or die "in: $@";
open($OUT, ">", $ARGV[0] . ".new") or die "out: $@";
while (<$IN>) {
my $line = $_;
$line =~ s/(\/\/.*)//g; # 删除C风格注释
$line =~ s/\r//g; # 删除^M
print $OUT $line;
}
close($IN);
close($OUT);
# 转换并替换原文件
$command = "mv $ARGV[0].new $ARGV[0] && chmod 777 $ARGV[0] && dos2unix $ARGV[0]";
system($command);
命令行工具技巧
按行长度排序
# 按行长度从长到短排序
cat file.txt | awk '{ print length($0) " " $0; }' | sort -r -n | cut -d ' ' -f 2-
# 按行长度从短到长排序
cat file.txt | awk '{ print length($0) " " $0; }' | sort -n | cut -d ' ' -f 2-
提取公共行
# 查找多个文件中的公共行
grep -F -x -f file1 file2 file3
# 查找在file1中但不在file2中的行
grep -F -x -v -f file2 file1
统计最常用命令
# 查看最常用的10个命令
history | awk '{a[$2]++} END {for(i in a) {print a[i]" "i}}' | sort -rn | head
模块化编程
创建可重用模块
# MyUtils.pm
package MyUtils;
use strict;
use warnings;
use Exporter 'import';
our @EXPORT_OK = qw(add multiply);
sub add {
my ($a, $b) = @_;
return $a + $b;
}
sub multiply {
my ($a, $b) = @_;
return $a * $b;
}
1;
# 使用模块
use MyUtils qw(add multiply);
print add(2, 3); # 5
print multiply(2, 3); # 6
Python模块化
# utils.py
def add(a, b):
return a + b
def multiply(a, b):
return a * b
# main.py
from utils import add, multiply
print(add(2, 3)) # 5
print(multiply(2, 3)) # 6
性能优化技巧
尾递归优化
// 普通递归阶乘
int factorial(int n) {
if (n <= 1) return 1;
return n * factorial(n - 1);
}
// 尾递归优化版本
int factorial_tail(int n, int accumulator) {
if (n <= 1) return accumulator;
return factorial_tail(n - 1, n * accumulator);
}
int factorial(int n) {
return factorial_tail(n, 1);
}
记忆化技术
# Fibonacci记忆化
from functools import lru_cache
@lru_cache(maxsize=None)
def fibonacci(n):
if n < 2:
return n
return fibonacci(n - 1) + fibonacci(n - 2)
# 手动实现记忆化
def fibonacci_memo():
cache = {}
def fib(n):
if n in cache:
return cache[n]
if n < 2:
result = n
else:
result = fib(n - 1) + fib(n - 2)
cache[n] = result
return result
return fib
fib = fibonacci_memo()
小结
本文汇集了多种编程语言和工具的实用技巧:
- JavaScript:数组操作、迭代器方法、jQuery技巧
- Python:数据结构实现、链表操作、算法实践
- Perl:One-liners、高级特性、文本处理
- 数据结构:多语言实现对比、算法优化
- 实用工具:文件操作、文本处理、命令行技巧
掌握这些技巧不仅能提高开发效率,还能帮助你写出更优雅、高效的代码。记住,好的工具和技巧是成为优秀开发者的重要助力。
持续学习和实践这些技巧,你会发现编程的更多乐趣和可能性。
