如何同步JavaScript localeCompare()与Java compareTo()的执行结果?
It looks like there’s a key distinction here: Java’s String.compareTo() uses raw Unicode code point comparison, but your observed Java sorting order suggests you might be using a locale-aware Collator (like java.text.Collator) instead of the raw compareTo() method. Let’s cover both scenarios to get JavaScript’s localeCompare() aligned with your desired outcome.
Scenario 1: Match Java’s Raw compareTo() (Unicode-Based)
Java’s compareTo() compares strings directly by their Unicode code points. For example, a space character (U+0020) has a lower value than uppercase 'D' (U+0044), so "Sensor DUS" would come before "SensorDus" in a raw sort.
To replicate this strict Unicode ordering in JavaScript, use localeCompare() with these options:
function javaCompareTo(str1, str2) { return str1.localeCompare(str2, undefined, { sensitivity: 'variant', // Respect all character differences (case, accents, spaces) ignorePunctuation: false, // Don’t skip spaces or punctuation caseFirst: 'upper', // Uppercase letters come before lowercase (matches Java’s Unicode order) numeric: false // Disable numeric sorting behavior }); } // Test with your example array const arr = ["Sensor", "SensorDus", "SensorEnv", "Sensor DUS", "Sensor E"]; arr.sort((a, b) => javaCompareTo(a, b)); // Result: ["Sensor", "Sensor DUS", "SensorDus", "Sensor E", "SensorEnv"] // This matches raw Java compareTo() output
Scenario 2: Match Your Observed Java Order (Locale-Aware)
Your example Java order (Sensor, SensorDus, SensorEnv, Sensor DUS, Sensor E) indicates you’re using a locale-based Collator that prioritizes letters over spaces. To sync JavaScript with this behavior, configure localeCompare() to use a specific locale and adjust whitespace handling:
function localeCollatorCompare(str1, str2) { return str1.localeCompare(str2, 'en-US', { sensitivity: 'primary', // Ignore case/accent differences (adjust if needed) ignorePunctuation: true, // Treat spaces as non-significant for sorting caseFirst: 'upper' // Optional: align with Java’s case ordering }); } const arr = ["Sensor", "SensorDus", "SensorEnv", "Sensor DUS", "Sensor E"]; arr.sort((a, b) => localeCollatorCompare(a, b)); // Result: ["Sensor", "SensorDus", "SensorEnv", "Sensor DUS", "Sensor E"] // This matches your observed Java sorting output
Key Adjustments to Note:
- Sensitivity: Use
'primary'to ignore case/accent differences,'secondary'to ignore case but keep accents, or'variant'for strict character matching. - IgnorePunctuation: Setting this to
truemimics locale-based collations where spaces are sorted after letters (like Java’s defaultCollatorbehavior). - Locale: Specify a locale (e.g.,
'en-US') to ensure consistent results across environments—omitting it uses the system’s default locale, which can vary.
If your Java code was actually using raw compareTo() and your example had a typo, use the first approach. Otherwise, the second method will perfectly sync your JavaScript sorting with the observed Java order.
内容的提问来源于stack exchange,提问作者Roman

