ICU-4360 sort like q values in descending order (stable sort)
X-SVN-Rev: 18123
This commit is contained in:
parent
6c8437aa84
commit
fee1acbab1
@ -1122,7 +1122,8 @@ public class ULocaleTest extends TestFmwk {
|
|||||||
/*1*/ { "en", "true" },
|
/*1*/ { "en", "true" },
|
||||||
/*2*/ { "en", "false" },
|
/*2*/ { "en", "false" },
|
||||||
/*3*/ { null, "false" },
|
/*3*/ { null, "false" },
|
||||||
/*4*/ { "es", "true" }, };
|
/*4*/ { "es", "true" },
|
||||||
|
/*5*/ { "de", "true" }};
|
||||||
|
|
||||||
private static final String ACCEPT_LANGUAGE_HTTP[] = {
|
private static final String ACCEPT_LANGUAGE_HTTP[] = {
|
||||||
/*0*/ "mt-mt, ja;q=0.76, en-us;q=0.95, en;q=0.92, en-gb;q=0.89, fr;q=0.87, iu-ca;q=0.84, iu;q=0.82, ja-jp;q=0.79, mt;q=0.97, de-de;q=0.74, de;q=0.71, es;q=0.68, it-it;q=0.66, it;q=0.63, vi-vn;q=0.61, vi;q=0.58, nl-nl;q=0.55, nl;q=0.53, th-th-traditional;q=.01",
|
/*0*/ "mt-mt, ja;q=0.76, en-us;q=0.95, en;q=0.92, en-gb;q=0.89, fr;q=0.87, iu-ca;q=0.84, iu;q=0.82, ja-jp;q=0.79, mt;q=0.97, de-de;q=0.74, de;q=0.71, es;q=0.68, it-it;q=0.66, it;q=0.63, vi-vn;q=0.61, vi;q=0.58, nl-nl;q=0.55, nl;q=0.53, th-th-traditional;q=.01",
|
||||||
@ -1139,7 +1140,8 @@ public class ULocaleTest extends TestFmwk {
|
|||||||
"xxx-yyy;q=.01, xxx-yyy;q=.01, xxx-yyy;q=.01, xxx-yyy;q=.01, xxx-yyy;q=.01, xxx-yyy;q=.01, "+
|
"xxx-yyy;q=.01, xxx-yyy;q=.01, xxx-yyy;q=.01, xxx-yyy;q=.01, xxx-yyy;q=.01, xxx-yyy;q=.01, "+
|
||||||
"xxx-yyy;q=.01, xxx-yyy;q=.01, xxx-yyy;q=.01, xxx-yyy;q=.01, xxx-yyy;q=.01, xxx-yyy;q=.01, "+
|
"xxx-yyy;q=.01, xxx-yyy;q=.01, xxx-yyy;q=.01, xxx-yyy;q=.01, xxx-yyy;q=.01, xxx-yyy;q=.01, "+
|
||||||
"xxx-yyy;q=.01, xxx-yyy;q=.01, xxx-yyy;q=.01, xxx-yyy;q=.01, xxx-yyy;q=.01, xxx-yyy;q=.01, "+
|
"xxx-yyy;q=.01, xxx-yyy;q=.01, xxx-yyy;q=.01, xxx-yyy;q=.01, xxx-yyy;q=.01, xxx-yyy;q=.01, "+
|
||||||
"es"};
|
"es",
|
||||||
|
/*5*/ "de;q=.9, fr;q=.9, xxx-yyy, sr;q=.8"};
|
||||||
|
|
||||||
|
|
||||||
public void TestAcceptLanguage() {
|
public void TestAcceptLanguage() {
|
||||||
|
@ -2657,6 +2657,33 @@ public final class ULocale implements Serializable {
|
|||||||
|
|
||||||
public static ULocale acceptLanguage(String acceptLanguageList, ULocale[]
|
public static ULocale acceptLanguage(String acceptLanguageList, ULocale[]
|
||||||
availableLocales, boolean[] fallback) {
|
availableLocales, boolean[] fallback) {
|
||||||
|
/**
|
||||||
|
* @internal ICU 3.4
|
||||||
|
* @deprecated this is an internal class
|
||||||
|
*/
|
||||||
|
class ULocaleAcceptLanguageQ implements Comparable {
|
||||||
|
private double q;
|
||||||
|
private double serial;
|
||||||
|
public ULocaleAcceptLanguageQ(double theq, int theserial) {
|
||||||
|
q = theq;
|
||||||
|
serial = theserial;
|
||||||
|
}
|
||||||
|
public int compareTo(Object o) {
|
||||||
|
ULocaleAcceptLanguageQ other = (ULocaleAcceptLanguageQ) o;
|
||||||
|
if(q > other.q) { // reverse - to sort in descending order
|
||||||
|
return -1;
|
||||||
|
} else if(q < other.q) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
if(serial < other.serial) {
|
||||||
|
return -1;
|
||||||
|
} else if(serial > other.serial) {
|
||||||
|
return 1;
|
||||||
|
} else {
|
||||||
|
return 0; // same object
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// 1st: parse out the acceptLanguageList into an array
|
// 1st: parse out the acceptLanguageList into an array
|
||||||
|
|
||||||
@ -2703,7 +2730,9 @@ public final class ULocale implements Serializable {
|
|||||||
}
|
}
|
||||||
|
|
||||||
String loc = acceptLanguageList.substring(n,paramEnd).trim();
|
String loc = acceptLanguageList.substring(n,paramEnd).trim();
|
||||||
map.put(new Double(1.0-q), new ULocale(canonicalize(loc))); // sort in reverse order.. 1.0, 0.9, 0.8 .. etc
|
int serial = map.size();
|
||||||
|
ULocaleAcceptLanguageQ entry = new ULocaleAcceptLanguageQ(q,serial);
|
||||||
|
map.put(entry, new ULocale(canonicalize(loc))); // sort in reverse order.. 1.0, 0.9, 0.8 .. etc
|
||||||
n = itemEnd; // get next item. (n++ will skip over delimiter)
|
n = itemEnd; // get next item. (n++ will skip over delimiter)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2714,7 +2743,6 @@ public final class ULocale implements Serializable {
|
|||||||
return acceptLanguage(acceptList, availableLocales, fallback);
|
return acceptLanguage(acceptList, availableLocales, fallback);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @draft ICU 3.4
|
* @draft ICU 3.4
|
||||||
* @deprecated This is a draft API and might change in a future release of ICU.
|
* @deprecated This is a draft API and might change in a future release of ICU.
|
||||||
@ -2732,7 +2760,6 @@ public final class ULocale implements Serializable {
|
|||||||
if(fallback != null) {
|
if(fallback != null) {
|
||||||
fallback[0]=true;
|
fallback[0]=true;
|
||||||
}
|
}
|
||||||
// System.out.println("exact match: " + acceptLanguageList[i]);
|
|
||||||
return acceptLanguageList[i];
|
return acceptLanguageList[i];
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2742,27 +2769,23 @@ public final class ULocale implements Serializable {
|
|||||||
|
|
||||||
if(len>maxLen) {
|
if(len>maxLen) {
|
||||||
maxLen = len;
|
maxLen = len;
|
||||||
// System.out.println("maxLen now " + maxLen);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Locale loc = acceptLanguageList[i].toLocale();
|
Locale loc = acceptLanguageList[i].toLocale();
|
||||||
String parent = LocaleUtility.fallback(loc).toString();
|
String parent = LocaleUtility.fallback(loc).toString();
|
||||||
acceptFallbacks[i] = parent;
|
acceptFallbacks[i] = parent;
|
||||||
// System.out.println("new fallback " + parent);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// OK, no direct one.
|
// OK, no direct match.
|
||||||
for(maxLen--;maxLen>0;maxLen--) {
|
for(maxLen--;maxLen>0;maxLen--) {
|
||||||
for(i=0;i<acceptFallbacks.length;i++) {
|
for(i=0;i<acceptFallbacks.length;i++) {
|
||||||
if(acceptFallbacks[i]!=null) {
|
if(acceptFallbacks[i]!=null) {
|
||||||
if(acceptFallbacks[i].length() == maxLen) {
|
if(acceptFallbacks[i].length() == maxLen) {
|
||||||
// System.out.println("Trying " + i + " - " + acceptFallbacks[i]);
|
|
||||||
for(j=0;j<availableLocales.length;j++) {
|
for(j=0;j<availableLocales.length;j++) {
|
||||||
if(availableLocales[j].equals(acceptFallbacks[i])) {
|
if(availableLocales[j].equals(acceptFallbacks[i])) {
|
||||||
if(fallback != null) {
|
if(fallback != null) {
|
||||||
fallback[0]=false;
|
fallback[0]=false;
|
||||||
}
|
}
|
||||||
// System.out.println("fallback match: " + acceptLanguageList[i]);
|
|
||||||
return new ULocale(acceptFallbacks[i]);
|
return new ULocale(acceptFallbacks[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user