Geo*_*sen 34 java string object comparator
我想通过String.CompareTo比较器对一个静态字符串数组进行排序和二进制搜索.
问题是排序和二进制搜索都要求传入Comparator对象 - 那么如何传入内置字符串比较器?
kos*_*osa 38
你可以编写自己的比较器
public class ExampleComparator implements Comparator<String> {
public int compare(String obj1, String obj2) {
if (obj1 == obj2) {
return 0;
}
if (obj1 == null) {
return -1;
}
if (obj2 == null) {
return 1;
}
return obj1.compareTo(obj2);
}
}
Run Code Online (Sandbox Code Playgroud)
Ant*_*nio 31
基于java.util.Comparator.comparing(...)的 Java 8解决方案:
Comparator<String> c = Comparator.comparing(String::toString);
Run Code Online (Sandbox Code Playgroud)
要么
Comparator<String> c = Comparator.comparing((String x) -> x);
Run Code Online (Sandbox Code Playgroud)
Cod*_*ice 19
该Arrays
班有版本sort()
和binarySearch()
它不需要Comparator.
例如,你可以使用的版本,Arrays.sort()
它只是需要对象的数组.这些方法调用compareTo()
数组中对象的方法.
Mik*_*kis 10
这是Comparator
任何类型Comparable
对象的通用,而不仅仅是String
:
package util;
import java.util.Comparator;
/**
* The Default Comparator for classes implementing Comparable.
*
* @param <E> the type of the comparable objects.
*
* @author Michael Belivanakis (michael.gr)
*/
public final class DefaultComparator<E extends Comparable<E>> implements Comparator<E>
{
@SuppressWarnings( "rawtypes" )
private static final DefaultComparator<?> INSTANCE = new DefaultComparator();
/**
* Get an instance of DefaultComparator for any type of Comparable.
*
* @param <T> the type of Comparable of interest.
*
* @return an instance of DefaultComparator for comparing instances of the requested type.
*/
public static <T extends Comparable<T>> Comparator<T> getInstance()
{
@SuppressWarnings("unchecked")
Comparator<T> result = (Comparator<T>)INSTANCE;
return result;
}
private DefaultComparator()
{
}
@Override
public int compare( E o1, E o2 )
{
if( o1 == o2 )
return 0;
if( o1 == null )
return 1;
if( o2 == null )
return -1;
return o1.compareTo( o2 );
}
}
Run Code Online (Sandbox Code Playgroud)
如何使用String
:
Comparator<String> stringComparator = DefaultComparator.getInstance();
Run Code Online (Sandbox Code Playgroud)
同样,Arrays.binarySearch(Object[] a, Object key)
只要对象类型具有可比性,就不需要比较器,但是使用lambda表达式现在更容易了.
只需用方法参考替换比较器: String::compareTo
例如:
Arrays.binarySearch(someStringArray, "The String to find.", String::compareTo);
Run Code Online (Sandbox Code Playgroud)
你也可以用
Arrays.binarySearch(someStringArray, "The String to find.", (a,b) -> a.compareTo(b));
Run Code Online (Sandbox Code Playgroud)
但即使在lambdas之前,总会有匿名课程:
Arrays.binarySearch(
someStringArray,
"The String to find.",
new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
return o1.compareTo(o2);
}
});
Run Code Online (Sandbox Code Playgroud)
此外,如果你想要不区分大小写的比较,在Java的最新版本中,String
类包含一个类型的public static final
字段,正如我最近发现的那样.所以,你可以使用完成你的工作.CASE_INSENSITIVE_ORDER
Comparator<String>
String.CASE_INSENSITIVE_ORDER
好的,这是几年后但是使用java 8你可以使用Comparator.naturalOrder():
http://docs.oracle.com/javase/8/docs/api/java/util/Comparator.html#naturalOrder--
来自javadoc:
static <T extends Comparable<? super T>> Comparator<T> naturalOrder()
Run Code Online (Sandbox Code Playgroud)
返回一个比较器,它按自然顺序比较Comparable对象.返回的比较器是可序列化的,并在比较null时抛出NullPointerException.
归档时间: |
|
查看次数: |
120416 次 |
最近记录: |