英文:
Re-sort a LinkedHashSet
问题
有一种方法可以对LinkedHashSet
中的链接进行排序吗?我知道它会保留元素添加的顺序,但是否有一种方法可以对这些链接进行重新排序,就像对链表进行排序一样,并且仍然表现出HashMap
的行为呢?
英文:
Is there a method to sort the links in a LinkedHashSet
? I know it preserves order in which the elements were added, but is there a way to re-sort those links as if it were a linked list, and have it still exhibit HashMap
behaviors?
答案1
得分: 1
很遗憾,由于sort()
方法来自于List
接口,而LinkedHashSet
未实现该接口。它实现了Set -> Collection接口。
不过,有一个解决方法,您可以将数据放入ArrayList或LinkedList中,在那里对其进行排序,然后将它们放入LinkedHashSet
,但此时顺序将会被排序。示例:
ArrayList<> list = ..<放入您的数据>..
list.sort(...); // 使用比较器
Set<> set = new LinkedHashSet(list);
结果将会是一个完全排序的LinkedHashSet
。
英文:
Unfortunately no, since sort()
comes from List
interface, which is not implemented by LinkedHashSet
. It implements Set -> Collection interfaces.
But, there is a workaround, you can put data to ArrayList or LinkedList, sort it there and then put them to LinkedHashSet
but now order will be sorted. Example:
ArraysList<> list = ..<put_your_data_here>..
list.sort(...); // with comparator
Set<> set = new LinkedHashSet(list);
As a result, you will have fully sorted LinkedHashSet
.
答案2
得分: 0
方法 1: 将 LinkedHashSet 转换为 TreeSet 实现自然排序
步骤:
- 创建新的 LinkedHashSet 对象
- 将内容存储/添加到 LinkedHashSet
- 创建新的 TreeSet 对象
- 将 LinkedHashSet 的内容作为参数传递给 TreeSet 的互相转换构造函数
package in.cj.resources.collection;
import java.util.LinkedHashSet;
import java.util.TreeSet;
public class SortingLinkedHashSetUsingTreeSet {
public static void main(String[] args) {
// 创建 String 类型的 LinkedHashSet 对象
LinkedHashSet<String> lhsCompanies =
new LinkedHashSet<String>();
// 向 LinkedHashSet 对象中添加元素
lhsCompanies.add("Dutchview");
lhsCompanies.add("Oracle");
lhsCompanies.add("Microsoft");
// 使用增强型 for 循环进行迭代
System.out.println("插入顺序:"
+ " 迭代 LinkedHashSet\n");
for (String company : lhsCompanies) {
System.out.println(company);
}
// 将 LinkedHashSet 转换为 TreeSet
TreeSet<String> tSet = new TreeSet<String>(lhsCompanies);
// 使用增强型 for 循环进行迭代
System.out.println("\n\n升序排序顺序:"
+ " 迭代 TreeSet\n");
for (String company : tSet) {
System.out.println(company);
}
}
}
方法 2: 将 LinkedHashSet 转换为 TreeSet 实现逆序排序
步骤:
- 创建新的 LinkedHashSet 对象,将内容存储/添加到 LinkedHashSet
- 创建新的 TreeSet 对象,并使用 Comparator 提供逆序排序逻辑
- 使用 addAll() 方法将 LinkedHashSet 的内容添加到 TreeSet
package in.cj.resources.collection;
import java.util.Comparator;
import java.util.LinkedHashSet;
import java.util.TreeSet;
public class ReverseSortingLinkedHashSetUsingTreeSet {
public static void main(String[] args) {
// 创建 String 类型的 LinkedHashSet 对象
LinkedHashSet<String> lhsCompanies =
new LinkedHashSet<String>();
// 向 LinkedHashSet 对象中添加元素
lhsCompanies.add("Dutchview");
lhsCompanies.add("Amazon");
lhsCompanies.add("Google");
// 使用增强型 for 循环进行迭代
System.out.println("插入顺序:"
+ " 迭代 LinkedHashSet\n");
for (String company : lhsCompanies) {
System.out.println(company);
}
// 创建新的 TreeSet 对象并提供逆序排序逻辑
TreeSet<String> tSet = new TreeSet<String>(
new Comparator<String>() {
@Override
public int compare(String str1, String str2) {
return str2.compareTo(str1);
}
});
// 使用 addAll() 方法将 LinkedHashSet 的内容添加到 TreeSet 实现逆序排序
tSet.addAll(lhsCompanies);
// 使用增强型 for 循环进行迭代
System.out.println("\n\n降序排序顺序:"
+ " 迭代 TreeSet\n");
for (String company : tSet) {
System.out.println(company);
}
}
}
英文:
You can achieve it in few ways.Sharing few which you can use
Way 1: Convert LinkedHashSet to TreeSet for natural-ordering
Steps:
- Create new LinkedHashSet object
- Store/add contents to LinkedHashSet
- Create new TreeSet object,
- Pass LinkedHashSet contents as argument to TreeSet’ inter-conversion constructor
package in.cj.resources.collection;
import java.util.LinkedHashSet;
import java.util.TreeSet;
public class SortingLinkedHashSetUsingTreeSet {
public static void main(String[] args) {
// creating LinkedHashSet object of type String
LinkedHashSet<String> lhsCompanies =
new LinkedHashSet<String>();
// adding elements to LinkedHashSet object
lhsCompanies.add("Dutchview");
lhsCompanies.add("Oracle");
lhsCompanies.add("Microsoft");
// Iterating using enhanced for-loop
System.out.println("Insertion Order:"
+ " Iterating LinkedHashSet\n");
for(String company : lhsCompanies) {
System.out.println(company);
}
// convert LinkedHashSet to TreeSet
TreeSet<String> tSet = new TreeSet<String>(lhsCompanies);
// Iterating using enhanced for-loop
System.out.println("\n\nAscending sorting-order:"
+ " Iterating TreeSet\n");
for(String company : tSet) {
System.out.println(company);
}
}
}
Way 2: Convert LinkedHashSet to TreeSet for reverse-ordering
Steps:
- Create new LinkedHashSet object Store/add contents to LinkedHashSet
- Create new TreeSet object and provide reverse-order sorting-logic
using Comparator Add LinkedHashSet contents to TreeSet using
addAll() method
package in.cj.resources.collection;
import java.util.Comparator;
import java.util.LinkedHashSet;
import java.util.TreeSet;
public class ReverseSortingLinkedHashSetUsingTreeSet {
public static void main(String[] args) {
// creating LinkedHashSet object of type String
LinkedHashSet<String> lhsCompanies =
new LinkedHashSet<String>();
// adding elements to LinkedHashSet object
lhsCompanies.add("Dutchview");
lhsCompanies.add("Amazon");
lhsCompanies.add("Google");
// Iterating using enhanced for-loop
System.out.println("Insertion Order:"
+ " Iterating LinkedHashSet\n");
for(String company : lhsCompanies) {
System.out.println(company);
}
// create new TreeSet object and provide reverse-sorting logic
TreeSet<String> tSet = new TreeSet<String>(
new Comparator<String>() {
@Override
public int compare(String str1, String str2) {
return str2.compareTo(str1);
}
});
// add LinkedHashSet to TreeSet for reverse-sorting elements
tSet.addAll(lhsCompanies);
// Iterating using enhanced for-loop
System.out.println("\n\nDescending sorting-order:"
+ " Iterating TreeSet\n");
for(String company : tSet) {
System.out.println(company);
}
}
}
答案3
得分: 0
如果出于某种原因确实需要更新现有 LinkedHashSet
的顺序,并且无法创建新的有序集合,您可以创建一个数据的有序副本,清空原始集合,然后添加所有元素。
TreeSet<String> sortedCopy = new TreeSet<>(linkedHashSet);
linkedHashSet.clear();
linkedHashSet.addAll(sortedCopy);
英文:
If for some reason you really need to update an ordering of an existing LinkedHashSet
and can't create a new ordered one, you could create a ordered copy of the data, clear the original set, then add all the elements.
TreeSet<String> sortedCopy = new TreeSet<>(linkedHashSet);
linkedHashSet.clear();
linkedHashSet.addAll(sortedCopy);
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论