本文目录导读:

我为您的需求整理了几种适合在 JEditorPane/HTMLEditorKit 环境中使用的 HTML 解析和排序算法实现方案。
HTML 内容提取与排序
import javax.swing.*;
import javax.swing.text.*;
import javax.swing.text.html.*;
import java.io.*;
import java.util.*;
public class HTMLSortExample {
public static void main(String[] args) {
JFrame frame = new JFrame("HTML Sorting Demo");
JEditorPane editorPane = new JEditorPane();
editorPane.setContentType("text/html");
editorPane.setEditable(false);
// 示例 HTML
String html = "<html><body>" +
"<h1>Items</h1>" +
"<ul>" +
"<li>Banana</li>" +
"<li>Apple</li>" +
"<li>Cherry</li>" +
"<li>Date</li>" +
"</ul>" +
"</body></html>";
editorPane.setText(html);
// 排序按钮
JButton sortBtn = new JButton("Sort Items");
sortBtn.addActionListener(e -> {
String sortedHtml = sortHTMLList(html, false);
editorPane.setText(sortedHtml);
});
JPanel panel = new JPanel(new BorderLayout());
panel.add(new JScrollPane(editorPane), BorderLayout.CENTER);
panel.add(sortBtn, BorderLayout.SOUTH);
frame.add(panel);
frame.setSize(400, 300);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
// 提取并排序 HTML 列表内容
public static String sortHTMLList(String html, boolean descending) {
try {
HTMLEditorKit kit = new HTMLEditorKit();
HTMLDocument doc = (HTMLDocument) kit.createDefaultDocument();
kit.read(new StringReader(html), doc, 0);
// 提取所有列表项
Element root = doc.getDefaultRootElement();
List<String> items = new ArrayList<>();
List<Element> liElements = new ArrayList<>();
extractListItems(root, items, liElements);
// 排序
if (descending) {
items.sort(Collections.reverseOrder());
} else {
Collections.sort(items);
}
// 重建 HTML
return rebuildHTML(html, items, liElements);
} catch (Exception e) {
e.printStackTrace();
return html;
}
}
private static void extractListItems(Element element, List<String> items, List<Element> liElements) {
for (int i = 0; i < element.getElementCount(); i++) {
Element child = element.getElement(i);
if ("li".equals(child.getName())) {
try {
int start = child.getStartOffset();
int end = child.getEndOffset();
String text = child.getDocument().getText(start, end - start).trim();
items.add(text);
liElements.add(child);
} catch (BadLocationException e) {
e.printStackTrace();
}
}
extractListItems(child, items, liElements);
}
}
private static String rebuildHTML(String originalHtml, List<String> sortedItems, List<Element> liElements) {
// 直接替换文本内容的简化实现
StringBuilder sb = new StringBuilder(originalHtml);
// 从后往前替换,避免位置偏移
for (int i = liElements.size() - 1; i >= 0; i--) {
Element li = liElements.get(i);
try {
int start = li.getStartOffset();
int end = li.getEndOffset();
String originalText = li.getDocument().getText(start, end - start);
// 在原始 HTML 中找到这个文本并替换
int htmlIndex = sb.indexOf(originalText);
if (htmlIndex >= 0) {
sb.replace(htmlIndex, htmlIndex + originalText.length(), sortedItems.get(i));
}
} catch (BadLocationException e) {
e.printStackTrace();
}
}
return sb.toString();
}
}
使用 DOM 解析器进行排序
import javax.swing.text.html.parser.*;
import javax.swing.text.html.*;
import javax.swing.text.*;
import java.util.*;
public class DOMSortExample {
public static String sortHTMLByTags(String html, String tagName) {
try {
HTMLEditorKit kit = new HTMLEditorKit();
HTMLDocument doc = (HTMLDocument) kit.createDefaultDocument();
kit.read(new StringReader(html), doc, 0);
// 查找指定标签的所有元素
ElementIterator iterator = new ElementIterator(doc);
Element element;
List<SortableElement> elements = new ArrayList<>();
while ((element = iterator.next()) != null) {
if (tagName.equals(element.getName())) {
String text = getElementText(doc, element);
elements.add(new SortableElement(element, text));
}
}
// 按文本排序
elements.sort(Comparator.comparing(e -> e.text));
// 返回排序后的 HTML
return buildSortedHTML(doc, elements, tagName);
} catch (Exception e) {
e.printStackTrace();
return html;
}
}
private static String getElementText(HTMLDocument doc, Element element) {
try {
int start = element.getStartOffset();
int end = element.getEndOffset();
return doc.getText(start, end - start).trim();
} catch (BadLocationException e) {
return "";
}
}
private static String buildSortedHTML(HTMLDocument doc, List<SortableElement> sortedElements, String tagName) {
// 这里实现重建 HTML 的逻辑
// 简化版本直接返回原始文档的字符串
StringBuilder result = new StringBuilder();
try {
StringWriter writer = new StringWriter();
new HTMLEditorKit().write(writer, doc, 0, doc.getLength());
result.append(writer.toString());
} catch (Exception e) {
e.printStackTrace();
}
return result.toString();
}
static class SortableElement {
Element element;
String text;
SortableElement(Element element, String text) {
this.element = element;
this.text = text;
}
}
}
简单字符串解析排序
import java.util.*;
import java.util.regex.*;
public class StringBasedHTMLSort {
// 按 HTML 标签内容排序
public static String sortByTagContent(String html, String tag) {
String regex = "<" + tag + "[^>]*>(.*?)</" + tag + ">";
Pattern pattern = Pattern.compile(regex, Pattern.DOTALL);
Matcher matcher = pattern.matcher(html);
List<MatchPair> matches = new ArrayList<>();
while (matcher.find()) {
matches.add(new MatchPair(matcher.start(), matcher.end(), matcher.group()));
}
// 按内容排序
matches.sort((a, b) -> {
String aContent = extractContent(a.text, tag);
String bContent = extractContent(b.text, tag);
return aContent.compareTo(bContent);
});
// 重建 HTML
StringBuilder result = new StringBuilder();
int lastEnd = 0;
for (MatchPair match : matches) {
result.append(html, lastEnd, match.start);
result.append(match.text);
lastEnd = match.end;
}
result.append(html.substring(lastEnd));
return result.toString();
}
private static String extractContent(String tagHtml, String tag) {
Pattern pattern = Pattern.compile("<" + tag + "[^>]*>(.*?)</" + tag + ">", Pattern.DOTALL);
Matcher matcher = pattern.matcher(tagHtml);
if (matcher.find()) {
return matcher.group(1).trim();
}
return "";
}
static class MatchPair {
int start, end;
String text;
MatchPair(int start, int end, String text) {
this.start = start;
this.end = end;
this.text = text;
}
}
// 使用示例
public static void main(String[] args) {
String html = "<div>" +
"<p>Banana</p>" +
"<p>Apple</p>" +
"<p>Cherry</p>" +
"</div>";
String sorted = sortByTagContent(html, "p");
System.out.println("Original: " + html);
System.out.println("Sorted: " + sorted);
}
}
完整表格行列排序示例
import javax.swing.*;
import javax.swing.table.*;
import java.awt.*;
public class JEditorPaneTableSorter extends JFrame {
public JEditorPaneTableSorter() {
setTitle("HTML Table Sorter");
setLayout(new BorderLayout());
JEditorPane editorPane = new JEditorPane();
editorPane.setContentType("text/html");
editorPane.setEditable(false);
String tableHtml = "<html><body>" +
"<table border='1'>" +
"<tr><th>Name</th><th>Age</th><th>City</th></tr>" +
"<tr><td>Alice</td><td>30</td><td>NYC</td></tr>" +
"<tr><td>Bob</td><td>25</td><td>LA</td></tr>" +
"<tr><td>Charlie</td><td>35</td><td>Chicago</td></tr>" +
"</table></body></html>";
editorPane.setText(tableHtml);
JButton sortByNameBtn = new JButton("Sort by Name");
JButton sortByAgeBtn = new JButton("Sort by Age");
JButton sortByCityBtn = new JButton("Sort by City");
sortByNameBtn.addActionListener(e -> {
String sorted = sortTableByColumn(tableHtml, 0);
editorPane.setText(sorted);
});
sortByAgeBtn.addActionListener(e -> {
String sorted = sortTableByColumn(tableHtml, 1);
editorPane.setText(sorted);
});
sortByCityBtn.addActionListener(e -> {
String sorted = sortTableByColumn(tableHtml, 2);
editorPane.setText(sorted);
});
JPanel buttonPanel = new JPanel();
buttonPanel.add(sortByNameBtn);
buttonPanel.add(sortByAgeBtn);
buttonPanel.add(sortByCityBtn);
add(new JScrollPane(editorPane), BorderLayout.CENTER);
add(buttonPanel, BorderLayout.SOUTH);
setSize(500, 400);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
}
private String sortTableByColumn(String html, int columnIndex) {
// 解析表格并排序
String[] rows = html.split("</tr>");
if (rows.length < 2) return html;
// 分离表头和表体
String header = rows[0] + "</tr>";
List<String> bodyRows = new ArrayList<>();
for (int i = 1; i < rows.length; i++) {
bodyRows.add(rows[i] + "</tr>");
}
// 按指定列排序
bodyRows.sort((r1, r2) -> {
String[] cols1 = r1.split("</td>");
String[] cols2 = r2.split("</td>");
if (columnIndex < cols1.length && columnIndex < cols2.length) {
String val1 = cols1[columnIndex].replaceAll("<[^>]+>", "").trim();
String val2 = cols2[columnIndex].replaceAll("<[^>]+>", "").trim();
return val1.compareTo(val2);
}
return 0;
});
// 重建 HTML
StringBuilder sorted = new StringBuilder(header);
for (String row : bodyRows) {
sorted.append(row);
}
// 确保 HTML 结构完整
String result = sorted.toString();
if (!result.startsWith("<html>")) {
result = "<html><body><table border='1'>" + result + "</table></body></html>";
}
return result;
}
public static void main(String[] args) {
SwingUtilities.invokeLater(JEditorPaneTableSorter::new);
}
}
选择建议
- 简单列表排序:使用方法 1 的
sortHTMLList() - 按标签排序:使用方法 2 或 3
- 表格排序:使用方法 4
- 性能要求高:使用方法 3 的字符串解析
这些算法都兼容 JEditorPane/HTMLEditorKit 环境,您可以根据具体需求选择最适合的实现。
版权声明:足球直播
足球直播
足球直播
足球直播
足球直播
中超直播
中超直播
中超直播
中超直播
中超直播
英超直播
英超直播
英超直播
英超直播
英超直播
德甲直播
德甲直播
德甲直播
德甲直播
德甲直播
西甲直播
西甲直播
西甲直播
西甲直播
西甲直播
意甲直播
意甲直播
意甲直播
意甲直播
意甲直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
足球直播
足球直播
足球直播
足球直播
足球直播
中超直播
中超直播
中超直播
中超直播
中超直播
英超直播
英超直播
英超直播
英超直播
英超直播
德甲直播
德甲直播
德甲直播
德甲直播
德甲直播
西甲直播
西甲直播
西甲直播
西甲直播
西甲直播
意甲直播
意甲直播
意甲直播
意甲直播
意甲直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
足球直播
足球直播
足球直播
足球直播
足球直播
中超直播
中超直播
中超直播
中超直播
中超直播
英超直播
英超直播
英超直播
英超直播
英超直播
德甲直播
德甲直播
德甲直播
德甲直播
德甲直播
西甲直播
西甲直播
西甲直播
西甲直播
西甲直播
意甲直播
意甲直播
意甲直播
意甲直播
意甲直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播