2024-08-15



<?php
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;
 
require 'path/to/PHPMailer/src/Exception.php';
require 'path/to/PHPMailer/src/PHPMailer.php';
require 'path/to/PHPMailer/src/SMTP.php';
 
$mail = new PHPMailer(true);
 
try {
    //Server settings
    $mail->isSMTP();                                         
    $mail->Host       = 'smtp.example.com';                   
    $mail->SMTPAuth   = true;                                 
    $mail->Username   = 'user@example.com';                   
    $mail->Password   = 'secret';                             
    $mail->SMTPSecure = PHPMailer::ENCRYPTION_SMTPS;          
    $mail->Port       = 465;                                  
 
    //Recipients
    $mail->setFrom('from@example.com', 'Mailer');
    $mail->addAddress('to@example.com', 'Joe User');          
 
    //Content
    $mail->isHTML(true);                                      
    $mail->Subject = 'Subject Text';
    $mail->Body    = 'Body Text';
    $mail->AltBody = 'This is the body in plain text for non-HTML mail clients';
 
    $mail->send();
    echo 'Message has been sent';
} catch (Exception $e) {
    echo "Message could not be sent. Mailer Error: {$mail->ErrorInfo}";
}

确保替换 'path/to/PHPMailer/src/...' 为实际的路径,以及设置正确的 SMTP 服务器、用户凭据和端口。这段代码演示了如何使用 PHPMailer 发送一封 HTML 格式的电子邮件。

2024-08-15



<?php
// 假设你已经通过 HTTP 请求获取到了数据,并且存储在 $data 变量中
$data = '从数据 API 获取的数据';
 
// 解析数据为数组
$arrayData = json_decode($data, true);
 
// 连接数据库
$mysqli = new mysqli('localhost', 'username', 'password', 'database');
 
// 检查连接是否成功
if ($mysqli->connect_error) {
    die('连接失败: ' . $mysqli->connect_error);
}
 
// 准备 SQL 语句
$sql = "INSERT INTO `your_table_name` (`column1`, `column2`, ...) VALUES (?, ?, ...)";
 
// 为 SQL 语句准备 statement
$stmt = $mysqli->prepare($sql);
 
// 绑定参数
$stmt->bind_param("sss...", $value1, $value2, ...);
 
// 遍历数据数组,并执行 SQL 插入语句
foreach ($arrayData as $row) {
    // 为 SQL 语句绑定值
    $stmt->bind_param("sss...", $row['column1'], $row['column2'], ...);
    
    // 执行 SQL 语句
    $stmt->execute();
}
 
// 关闭 statement
$stmt->close();
 
// 关闭连接
$mysqli->close();
 
echo '数据导入成功';
?>

在这个代码实例中,我们首先通过 HTTP 请求获取数据,然后将数据解析为 PHP 数组。接着,我们连接 MySQL 数据库,并为每一行数据准备好 SQL 插入语句,并执行插入操作。最后,我们关闭 statement 和数据库连接。这个过程是安全的,并且能有效防止 SQL 注入攻击。

2024-08-14

在Java中,流式处理通常是通过java.util.stream包中的Streams API来实现的。以下是一个简单的例子,展示了如何使用Java Streams API来处理一个集合:




import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
 
public class StreamExample {
    public static void main(String[] args) {
        // 创建一个列表
        List<String> items = Arrays.asList("apple", "banana", "orange", "kiwi");
 
        // 使用流来过滤出长度大于5的字符串
        List<String> filteredItems = items.stream()
                                          .filter(s -> s.length() > 5)
                                          .collect(Collectors.toList());
 
        // 打印过滤后的结果
        filteredItems.forEach(System.out::println);
    }
}

这段代码首先创建了一个包含几个字符串的列表。然后,使用stream()方法将列表转换成流,接着使用filter()方法来过滤出长度大于5的字符串。最后,使用collect()方法将过滤后的流收集成一个新的列表。

这只是流式处理的一个非常基本的例子。Java Streams API 提供了许多其他的操作,如map()sorted()reduce()等,可以用来进行更复杂的数据处理。

2024-08-14

滑动窗口算法是一种用于处理字符串或数组中子串问题的高效方法。它通过维护一个窗口,在遍历字符串或数组的过程中,不断更新窗口大小,从而找出满足条件的子串或子序列。

在LeetCode上,滑动窗口算法常见于以下问题类型:

  1. 子串问题:找出字符串中最长/最短的子串满足某种条件。
  2. 字符统计:计算字符串中字符出现的次数。
  3. 字母异位词:判断两个字符串是否由相同的字母构成,可以考虑使用滑动窗口。

以下是一些使用滑动窗口解决的经典问题:

  • 无重复字符的最长子串
  • 滑动窗口最大值
  • 最小滑动窗口范围
  • 滑动窗口中的最大值

解决这些问题通常需要设置两个指针,一个代表窗口的开始,另一个代表窗口的结束,根据需要更新窗口的大小或移动窗口。

以下是无重复字符的最长子串的示例代码:




class Solution:
    def lengthOfLongestSubstring(self, s: str) -> int:
        # 使用哈希集合记录字符是否出现过
        occ = set()
        n = len(s)
        # 右指针,初始值为-1表示还没有开始移动
        rk, ans = -1, 0
        for i in range(n):
            if i != 0:
                # 左指针向右移动
                occ.remove(s[i - 1])
            while rk + 1 < n and s[rk + 1] not in occ:
                # 不断扩大窗口直到出现重复字符
                occ.add(s[rk + 1])
                rk += 1
            # 更新最长无重复子串的长度
            ans = max(ans, rk - i + 1)
        return ans

滑动窗口算法是一种非常实用的技巧,可以解决许多字符串和数组问题。理解和熟练运用该算法对于高效解决编程问题至关重要。

2024-08-14



import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Date;
 
public class ExcelExportExample {
 
    public static void main(String[] args) throws IOException {
        Workbook workbook = new XSSFWorkbook();
        Sheet sheet = workbook.createSheet("ExampleSheet");
 
        // 创建表头
        Row header = sheet.createRow(0);
        header.createCell(0).setCellValue("序号");
        header.createCell(1).setCellValue("姓名");
        header.createCell(2).setCellValue("生日");
 
        // 填充数据
        for (int rowNum = 1; rowNum < 10; rowNum++) {
            Row row = sheet.createRow(rowNum);
            for (int cellNum = 0; cellNum < 3; cellNum++) {
                Cell cell = row.createCell(cellNum);
                switch (cellNum) {
                    case 0:
                        cell.setCellValue(rowNum);
                        break;
                    case 1:
                        cell.setCellValue("姓名" + rowNum);
                        break;
                    case 2:
                        cell.setCellValue(setDateCellStyle(row.createCell(cellNum), getRandomDate()));
                        break;
                }
            }
        }
 
        // 写入到文件
        try (FileOutputStream outputStream = new FileOutputStream("example.xlsx")) {
            workbook.write(outputStream);
        }
        workbook.close();
    }
 
    private static Date getRandomDate() {
        // 这里生成一个随机日期,仅用作示例
        long randomDateMillis = System.currentTimeMillis() - (long) (Math.random() * 10000);
        return new Date(randomDateMillis);
    }
 
    private static CellStyle setDateCellStyle(Cell cell, Date date) {
        CreationHelper createHelper = cell.getSheet().getWorkbook().getCreationHelper();
        CellStyle cellStyle = cell.getSheet().getWorkbook().createCellStyle();
        cellStyle.setDataFormat(createHelper.createDataFormat().getFormat("yyyy-MM-dd"));
        cell.setCellStyle(cellStyle);
        cell.setCellValue(date);
        return cellStyle;
    }
}

这段代码使用Apache POI库创建了一个Excel文件,并填充了数据和样式。其中,setDateCellStyle方法设置了日期的样式,并处理了时间转换问题。这是一个简化的例子,展示了如何使用Apache POI处理Excel导出的基本方法。

2024-08-14



// 抽象化角色:图形接口
interface Shape {
    void draw();
}
 
// 实现化角色:具体图形类
class Circle implements Shape {
    @Override
    public void draw() {
        System.out.println("Circle is drawn.");
    }
}
 
class Rectangle implements Shape {
    @Override
    public void draw() {
        System.out.println("Rectangle is drawn.");
    }
}
 
// 抽象化角色:颜色接口
interface Color {
    void fill();
}
 
// 实现化角色:具体颜色类
class Red implements Color {
    @Override
    public void fill() {
        System.out.println("Color is red.");
    }
}
 
class Green implements Color {
    @Override
    public void fill() {
        System.out.println("Color is green.");
    }
}
 
// 桥接角色:桥接类
class Bridge {
    private Shape shape;
    private Color color;
 
    public Bridge(Shape shape, Color color) {
        this.shape = shape;
        this.color = color;
    }
 
    public void draw() {
        shape.draw();
        color.fill();
    }
}
 
// 客户端代码
public class BridgePatternDemo {
    public static void main(String[] args) {
        // 创建一个红色的圆
        Bridge bridge = new Bridge(new Circle(), new Red());
        bridge.draw();  // 输出: Circle is drawn. Color is red.
    }
}

这个代码示例展示了如何使用桥接模式来将图形的绘制和颜色填充进行分离,从而可以独立地对它们进行扩展。在客户端代码中,我们创建了一个红色的圆形,并调用了draw()方法,它会分别调用图形的draw()和颜色的fill()方法,输出相应的信息。这样的设计使得每个类都可以独立地扩展和改变,满足开闭原则。

2024-08-14

Collections 是 Java 集合框架中的一个工具类,它提供了一系列静态方法,用于对集合进行排序、搜索以及线程安全等操作。

以下是一些常用的 Collections 方法和示例代码:

  1. sort(List<T> list):对列表进行排序。



List<String> list = new ArrayList<>();
list.add("Banana");
list.add("Orange");
list.add("Apple");
Collections.sort(list);
  1. shuffle(List<?> list):对列表进行随机排序。



Collections.shuffle(list);
  1. reverse(List<?> list):反转列表中元素的顺序。



Collections.reverse(list);
  1. binarySearch(List<?> list, T key):在已排序列表中搜索指定元素。



String key = "Orange";
int index = Collections.binarySearch(list, key);
  1. max(Collection<? extends T> coll)min(Collection<? extends T> coll):获取集合中的最大或最小元素。



int max = Collections.max(list);
int min = Collections.min(list);
  1. synchronizedList(List<T> list):返回指定列表的同步(线程安全的)视图。



List<String> synchronizedList = Collections.synchronizedList(list);
  1. unmodifiableList(List<? extends T> list):返回指定列表的不可修改视图。



List<String> unmodifiableList = Collections.unmodifiableList(list);

这些方法提供了对集合进行基本操作的有效手段,在实际开发中被广泛应用。

2024-08-14

在Java中,字符集用于指定字符序列如何编码成字节序列以及如何解码成字符序列。Java内部处理字符和字符串时使用Unicode(一种字符编码标准),而当这些数据要写入磁盘或通过网络发送时,需要将Unicode字符串转换为特定的字符编码格式。

以下是一个简单的例子,演示如何在Java中使用字符集进行编码和解码:




import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.nio.charset.UnsupportedCharsetException;
 
public class CharsetExample {
    public static void main(String[] args) {
        // 使用UTF-8字符集进行编码
        Charset utf8Charset = StandardCharsets.UTF_8;
        byte[] encodedBytes = "Hello, World!".getBytes(utf8Charset);
 
        // 使用UTF-8字符集进行解码
        String decodedString = new String(encodedBytes, utf8Charset);
        System.out.println(decodedString); // 输出: Hello, World!
 
        // 尝试使用不支持的字符集
        try {
            Charset unsupportedCharset = Charset.forName("UnsupportedCharset");
        } catch (UnsupportedCharsetException e) {
            System.out.println("Unsupported charset: " + e.getCharsetName());
        }
    }
}

在这个例子中,我们首先使用StandardCharsets.UTF_8获取UTF-8字符集的实例。然后,我们使用getBytes(utf8Charset)将字符串编码为字节序列,并使用new String(encodedBytes, utf8Charset)将字节序列解码回字符串。最后,我们捕获并处理了一个UnsupportedCharsetException异常,以展示如何处理不支持的字符集。

2024-08-14



<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 https://maven.apache.org/xsd/settings-1.0.0.xsd">
  <mirrors>
    <!-- 配置阿里云的Maven镜像 -->
    <mirror>
      <id>alimaven</id>
      <name>aliyun maven</name>
      <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
      <mirrorOf>central</mirrorOf>
    </mirror>
  </mirrors>
</settings>

这段代码展示了如何在Maven的settings.xml文件中配置阿里云的镜像源,以便加快依赖下载速度。通过替换中央仓库的URL,指定了一个在中国大陆可访问的阿里云镜像地址。这是一个常见的做法,尤其是在某些情况下,中央仓库的访问可能会受到网络的限制。

2024-08-14



import java.sql.*;
 
public class JDBCExample {
    public static void main(String[] args) {
        // 数据库URL,用户名和密码
        String jdbcUrl = "jdbc:mysql://localhost:3306/数据库名";
        String user = "用户名";
        String pass = "密码";
 
        // 注册JDBC驱动
        try {
            Class.forName("com.mysql.cj.jdbc.Driver");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
            return;
        }
 
        // 建立连接
        try (Connection conn = DriverManager.getConnection(jdbcUrl, user, pass);
             // 创建Statement对象
             Statement statement = conn.createStatement();
             // 创建结果集对象
             ResultSet resultSet = statement.executeQuery("SHOW DATABASES")) {
 
            // 遍历数据库名
            while (resultSet.next()) {
                System.out.println("数据库名: " + resultSet.getString(1));
            }
 
            // 获取指定数据库的表名和字段信息
            String tableQuery = "SELECT TABLE_NAME, COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = '数据库名'";
            resultSet = statement.executeQuery(tableQuery);
 
            // 遍历表名和字段名
            while (resultSet.next()) {
                System.out.println("表名: " + resultSet.getString("TABLE_NAME") + ", 字段名: " + resultSet.getString("COLUMN_NAME"));
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

确保替换jdbc:mysql://localhost:3306/数据库名中的数据库名用户名密码为实际的数据库信息。代码中使用了try-with-resources结构来自动关闭数据库连接和相关资源,避免了显式关闭资源的需要。