如何获得可用的国家和货币?
How to get available countries and Currencies?
我尝试同时获取所有可用国家和货币的列表。
我希望国家名称出现在微调器上,当用户选择国家时,它是 return 货币符号。
我的方法有效,但我认为这是非常糟糕的做法,因为加载数据大约需要 3-2 秒。
我是这样做的:
public ArrayList<CurrencyModel> getCountriesAndCurrency(){
ArrayList<CurrencyModel> result = new ArrayList<>();
ArrayList<Locale> list = new ArrayList<>(Arrays.asList(Locale.getAvailableLocales()));
for (int i = 0; i <list.size(); i++) {
String country = list.get(i).getDisplayCountry();
try {
Locale pickedLocal = new Locale(list.get(i).getISO3Language(), list.get(i).getCountry());
String code = Currency.getInstance(pickedLocal).getCurrencyCode();
Currency currency = Currency.getInstance(code);
String currencySymbol = currency.getSymbol(pickedLocal);
if(currencySymbol.length()>1){
currencySymbol = currency.getSymbol();
}
result.add(new CurrencyModel(list.get(i), country, currencySymbol));
} catch (Exception e) {
}
}
Collections.sort(result, new CustomComparator());
ArrayList<CurrencyModel> finalRes = new ArrayList<>();
for (int i = 0; i < result.size(); i++) {
try {
if(!result.get(i).getCountryName().equals(result.get((i+1)).getCountryName())) {
finalRes.add(result.get(i));
}
}catch (Exception e){}
}
Collections.sort(finalRes, new CustomComparator());
return finalRes;
}
public class CustomComparator implements Comparator<CurrencyModel> {
@Override
public int compare(CurrencyModel o1, CurrencyModel o2) {
return o1.getCountryName().compareTo(o2.getCountryName());
}
}
CurrencyModel 对象是 = locale locale ,String countryName , String currencySymbol。
这个动作有更好的解决方案吗?
发现有几件事可以帮助您
不确定他们是否会显着提高结果
1- 语言环境重新实例化
Locale pickedLocal = new Locale(list.get(i).getISO3Language(), list.get(i).getCountry());
为什么要使用 locale
属性重新创建 locale ?
你只需要分配它:
Locale pickedLocal = list.get(i);
2- 货币相同,
String code = Currency.getInstance(pickedLocal).getCurrencyCode();
Currency currency = Currency.getInstance(code);
String currencySymbol = currency.getSymbol(pickedLocal);
据我所知,你的目标是 currencySymbol
,所以就这样做吧:
String currencySymbol = Currency.getInstance(pickedLocal).getSymbol();
因此最后的代码块(带有 try-catch 的代码块)应该如下所示
try {
Locale pickedLocal = list.get(i);
String currencySymbol = Currency.getInstance(pickedLocal).getSymbol();
if(currencySymbol.length()>1){
currencySymbol = currency.getSymbol();
}
result.add(new CurrencyModel(pickedLocal, country, currencySymbol));
} catch (Exception e) {
}
在 result.add(new CurrencyModel(list.get(i),...
使用 pickedLocal,不要从列表中重新获取项目。
这就是我到目前为止所得到的,我将在这个答案中附加任何进一步的发现。
编辑:(也许您必须先对邮件 "list" 进行排序)
再次查看代码,我发现您在填充结果列表后尝试删除重复项,如果您在添加新项目之前检查结果列表,您将摆脱第二个循环
try {
Locale pickedLocal = list.get(i);
String currencySymbol = Currency.getInstance(pickedLocal).getSymbol();
if(currencySymbol.length()>1){
currencySymbol = currency.getSymbol();
}
//TO AVOID the second loop (check duplicates), add only if not exist
final int size = result.size();
if(size > 0){
if(!result.get(size-1).getCountryName().equals(country)){
//no similar item was added yet, so add the new item
result.add(new CurrencyModel(pickedLocal, country, currencySymbol));
}
}else{
//it still empty, just add the new item
result.add(new CurrencyModel(pickedLocal, country, currencySymbol));
}
} catch (Exception e) {
}
我尝试同时获取所有可用国家和货币的列表。 我希望国家名称出现在微调器上,当用户选择国家时,它是 return 货币符号。 我的方法有效,但我认为这是非常糟糕的做法,因为加载数据大约需要 3-2 秒。 我是这样做的:
public ArrayList<CurrencyModel> getCountriesAndCurrency(){
ArrayList<CurrencyModel> result = new ArrayList<>();
ArrayList<Locale> list = new ArrayList<>(Arrays.asList(Locale.getAvailableLocales()));
for (int i = 0; i <list.size(); i++) {
String country = list.get(i).getDisplayCountry();
try {
Locale pickedLocal = new Locale(list.get(i).getISO3Language(), list.get(i).getCountry());
String code = Currency.getInstance(pickedLocal).getCurrencyCode();
Currency currency = Currency.getInstance(code);
String currencySymbol = currency.getSymbol(pickedLocal);
if(currencySymbol.length()>1){
currencySymbol = currency.getSymbol();
}
result.add(new CurrencyModel(list.get(i), country, currencySymbol));
} catch (Exception e) {
}
}
Collections.sort(result, new CustomComparator());
ArrayList<CurrencyModel> finalRes = new ArrayList<>();
for (int i = 0; i < result.size(); i++) {
try {
if(!result.get(i).getCountryName().equals(result.get((i+1)).getCountryName())) {
finalRes.add(result.get(i));
}
}catch (Exception e){}
}
Collections.sort(finalRes, new CustomComparator());
return finalRes;
}
public class CustomComparator implements Comparator<CurrencyModel> {
@Override
public int compare(CurrencyModel o1, CurrencyModel o2) {
return o1.getCountryName().compareTo(o2.getCountryName());
}
}
CurrencyModel 对象是 = locale locale ,String countryName , String currencySymbol。
这个动作有更好的解决方案吗?
发现有几件事可以帮助您 不确定他们是否会显着提高结果
1- 语言环境重新实例化
Locale pickedLocal = new Locale(list.get(i).getISO3Language(), list.get(i).getCountry());
为什么要使用 locale
属性重新创建 locale ?
你只需要分配它:
Locale pickedLocal = list.get(i);
2- 货币相同,
String code = Currency.getInstance(pickedLocal).getCurrencyCode();
Currency currency = Currency.getInstance(code);
String currencySymbol = currency.getSymbol(pickedLocal);
据我所知,你的目标是 currencySymbol
,所以就这样做吧:
String currencySymbol = Currency.getInstance(pickedLocal).getSymbol();
因此最后的代码块(带有 try-catch 的代码块)应该如下所示
try {
Locale pickedLocal = list.get(i);
String currencySymbol = Currency.getInstance(pickedLocal).getSymbol();
if(currencySymbol.length()>1){
currencySymbol = currency.getSymbol();
}
result.add(new CurrencyModel(pickedLocal, country, currencySymbol));
} catch (Exception e) {
}
在 result.add(new CurrencyModel(list.get(i),...
使用 pickedLocal,不要从列表中重新获取项目。
这就是我到目前为止所得到的,我将在这个答案中附加任何进一步的发现。
编辑:(也许您必须先对邮件 "list" 进行排序) 再次查看代码,我发现您在填充结果列表后尝试删除重复项,如果您在添加新项目之前检查结果列表,您将摆脱第二个循环
try {
Locale pickedLocal = list.get(i);
String currencySymbol = Currency.getInstance(pickedLocal).getSymbol();
if(currencySymbol.length()>1){
currencySymbol = currency.getSymbol();
}
//TO AVOID the second loop (check duplicates), add only if not exist
final int size = result.size();
if(size > 0){
if(!result.get(size-1).getCountryName().equals(country)){
//no similar item was added yet, so add the new item
result.add(new CurrencyModel(pickedLocal, country, currencySymbol));
}
}else{
//it still empty, just add the new item
result.add(new CurrencyModel(pickedLocal, country, currencySymbol));
}
} catch (Exception e) {
}