如何对地图进行排序或我需要遵循哪种遍历方法?
How to sort map or which traversal approach i need to follow?
我只想得到一个排序的地图我的代码是这样的:
public class SubString {public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("string2");
list.add("STR_str2");
list.add("STR_str3");
getSequesce("STR_str1", list);
List<String> list1 = new ArrayList<>();
list1.add("STR_xyz");
list1.add("STR_ABC");
getSequesce("STR_str2", list1);
List<String> list3 = new ArrayList<>();
list3.add("Anukul");
list3.add("mittal");
getSequesce("STR_str3", list3);
List<String> list4 = new ArrayList<>();
list4.add("Test");
list4.add("STR_XYZ");
getSequesce("STR_ABC", list4);
List<String> list5 = new ArrayList<>();
list5.add("val");
list5.add("var");
getSequesce("STR_XYZ", list5);
List<String> list6 = new ArrayList<>();
list6.add("val6");
list6.add("valtest");
getSequesce("STR_free", list6);
List<String> list7 = new ArrayList<>();
list7.add("val6");
list7.add("STR_free");
getSequesce("STR_7", list7);
}private static void getSequesce(String string, List<String> list) {
Map<String, List<String>> map = new HashMap<>();
Map<String, List<String>> sortedMap = new TreeMap<>();
map.put(string, list);
for (Map.Entry<String, List<String> > itrMap : map.entrySet() ) {
}
}}
在我第一次调用 getSequence 方法时,我输入了一个字符串 "STR_str1" 和一个列表。
我只想将其添加到键为 STR_str1 且其值为列表的地图中。
但我的问题是我必须在 STR_str1 之前将 STR_str2 和 STR_str3 作为地图中的键。同样,我必须在 STR_str2 之前放置 STR_ABC 和 STR_XYZ。
我只想要一个来自函数 getSequesce 的 sortedMap 以便我得到像
这样的输出
STR_free,list6
"STR_7", list7
STR_XYZ,list5
STR_ABC,list4
STR_str3,list3
"STR_str2", list1
"STR_str1", 列表
如果列表的值以 STR_ 开头,则此 STR_ 必须已在地图中可用。
position of "STR_free", list6 "STR_XYZ", list5 "STR_str3", list3 可以在任何地方,因为它们不包含任何依赖关系。
请帮我建议我可以遵循的方法。我有不会产生循环问题的数据。
谢谢
Map根据定义是没有排序的(和set一样)所以不能保证遍历顺序。但是有一个接口 SortedMap 及其实现(例如 TreeMap)。在这种情况下,您的密钥必须以有意义的方式实现 equals() 和 hashcode() 或实现 Comparable 接口。在您的情况下,您使用字符串作为键和字符串实现可比较。所以你可以使用 SortedMap
谢谢大家的帮助,我正在寻找的代码是
private static Map<String, List<String>> map = new LinkedHashMap<String, List<String>>();
private static List<String> nonDependentList = new ArrayList<String>();
private static Map<String, List<String>> dependentMap = new ConcurrentHashMap<String, List<String>>();
public static void main(String[] args) {
List<String> list1 = new ArrayList<>();
list1.add("string2");
list1.add("STR_str2");
list1.add("STR_str3");
addRecord("STR_str1", list1);
List<String> list2 = new ArrayList<>();
list2.add("STR_xyz");
list2.add("STR_ABC");
addRecord("STR_str2", list2);
List<String> list3 = new ArrayList<>();
list3.add("Anukul");
list3.add("mittal");
addRecord("STR_str3", list3);
List<String> list4 = new ArrayList<>();
list4.add("Test");
list4.add("STR_XYZ");
addRecord("STR_ABC", list4);
List<String> list5 = new ArrayList<>();
list5.add("val");
list5.add("var");
addRecord("STR_XYZ", list5);
List<String> list6 = new ArrayList<>();
list6.add("val6");
list6.add("valtest");
addRecord("STR_free", list6);
List<String> list7 = new ArrayList<>();
list7.add("val6");
list7.add("STR_free");
addRecord("STR_7", list7);
Map<String, List<String>> processedMap = proceedAndFetchRecords();
System.out.println("Final result");
for (Entry<String, List<String>> entry : processedMap.entrySet()) {
System.out.println("Key : " + entry.getKey() + " || Values : " + entry.getValue());
}
}
private static Map<String, List<String>> proceedAndFetchRecords() {
for (Entry<String, List<String>> entry : map.entrySet()) {
boolean flag = isNotDependent(entry.getValue());
// System.out.println("Key : " + entry.getKey() + " isNotDependent :
// " + flag);
if (flag) {
nonDependentList.add(entry.getKey());
} else {
List<String> list = getOnlyDependentList(entry.getValue());
dependentMap.put(entry.getKey(), list);
}
}
// showDependentMap();
refreshDependentMap();
// Final result
Map<String, List<String>> processedMap = addResultsInMap();
return processedMap;
}
private static void refreshDependentMap() {
for (Entry<String, List<String>> entry : dependentMap.entrySet()) {
List<String> list = entry.getValue();
list.removeAll(nonDependentList);
boolean flag = isNotDependent(list);
if (flag) {
nonDependentList.add(entry.getKey());
dependentMap.remove(entry.getKey());
refreshDependentMap();
} else {
continue;
}
}
}
private static Map<String, List<String>> addResultsInMap() {
Map<String, List<String>> processedMap = new LinkedHashMap<String, List<String>>();
for (String key : nonDependentList) {
processedMap.put(key, map.get(key));
}
for (Entry<String, List<String>> entry : dependentMap.entrySet()) {
processedMap.put(entry.getKey(), map.get(entry.getKey()));
}
return processedMap;
}
private static boolean isNotDependent(List<String> list) {
int count = 0;
for (String string : list) {
if (!string.startsWith("STR_")) {
++count;
}
}
if (list.size() == count) {
return true;
}
return false;
}
private static void addRecord(String structureName, List<String> list) {
map.put(structureName, list);
}
private static List<String> getOnlyDependentList(List<String> list) {
List<String> list1 = new ArrayList<>();
for (String string : list) {
if (string.startsWith("STR_")) {
list1.add(string);
}
}
return list1;
}}
我只想得到一个排序的地图我的代码是这样的:
public class SubString {public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("string2");
list.add("STR_str2");
list.add("STR_str3");
getSequesce("STR_str1", list);
List<String> list1 = new ArrayList<>();
list1.add("STR_xyz");
list1.add("STR_ABC");
getSequesce("STR_str2", list1);
List<String> list3 = new ArrayList<>();
list3.add("Anukul");
list3.add("mittal");
getSequesce("STR_str3", list3);
List<String> list4 = new ArrayList<>();
list4.add("Test");
list4.add("STR_XYZ");
getSequesce("STR_ABC", list4);
List<String> list5 = new ArrayList<>();
list5.add("val");
list5.add("var");
getSequesce("STR_XYZ", list5);
List<String> list6 = new ArrayList<>();
list6.add("val6");
list6.add("valtest");
getSequesce("STR_free", list6);
List<String> list7 = new ArrayList<>();
list7.add("val6");
list7.add("STR_free");
getSequesce("STR_7", list7);
}private static void getSequesce(String string, List<String> list) {
Map<String, List<String>> map = new HashMap<>();
Map<String, List<String>> sortedMap = new TreeMap<>();
map.put(string, list);
for (Map.Entry<String, List<String> > itrMap : map.entrySet() ) {
}
}}
在我第一次调用 getSequence 方法时,我输入了一个字符串 "STR_str1" 和一个列表。 我只想将其添加到键为 STR_str1 且其值为列表的地图中。 但我的问题是我必须在 STR_str1 之前将 STR_str2 和 STR_str3 作为地图中的键。同样,我必须在 STR_str2 之前放置 STR_ABC 和 STR_XYZ。 我只想要一个来自函数 getSequesce 的 sortedMap 以便我得到像
这样的输出STR_free,list6
"STR_7", list7
STR_XYZ,list5
STR_ABC,list4
STR_str3,list3
"STR_str2", list1
"STR_str1", 列表
如果列表的值以 STR_ 开头,则此 STR_ 必须已在地图中可用。
position of "STR_free", list6 "STR_XYZ", list5 "STR_str3", list3 可以在任何地方,因为它们不包含任何依赖关系。
请帮我建议我可以遵循的方法。我有不会产生循环问题的数据。 谢谢
Map根据定义是没有排序的(和set一样)所以不能保证遍历顺序。但是有一个接口 SortedMap 及其实现(例如 TreeMap)。在这种情况下,您的密钥必须以有意义的方式实现 equals() 和 hashcode() 或实现 Comparable 接口。在您的情况下,您使用字符串作为键和字符串实现可比较。所以你可以使用 SortedMap
谢谢大家的帮助,我正在寻找的代码是
private static Map<String, List<String>> map = new LinkedHashMap<String, List<String>>();
private static List<String> nonDependentList = new ArrayList<String>();
private static Map<String, List<String>> dependentMap = new ConcurrentHashMap<String, List<String>>();
public static void main(String[] args) {
List<String> list1 = new ArrayList<>();
list1.add("string2");
list1.add("STR_str2");
list1.add("STR_str3");
addRecord("STR_str1", list1);
List<String> list2 = new ArrayList<>();
list2.add("STR_xyz");
list2.add("STR_ABC");
addRecord("STR_str2", list2);
List<String> list3 = new ArrayList<>();
list3.add("Anukul");
list3.add("mittal");
addRecord("STR_str3", list3);
List<String> list4 = new ArrayList<>();
list4.add("Test");
list4.add("STR_XYZ");
addRecord("STR_ABC", list4);
List<String> list5 = new ArrayList<>();
list5.add("val");
list5.add("var");
addRecord("STR_XYZ", list5);
List<String> list6 = new ArrayList<>();
list6.add("val6");
list6.add("valtest");
addRecord("STR_free", list6);
List<String> list7 = new ArrayList<>();
list7.add("val6");
list7.add("STR_free");
addRecord("STR_7", list7);
Map<String, List<String>> processedMap = proceedAndFetchRecords();
System.out.println("Final result");
for (Entry<String, List<String>> entry : processedMap.entrySet()) {
System.out.println("Key : " + entry.getKey() + " || Values : " + entry.getValue());
}
}
private static Map<String, List<String>> proceedAndFetchRecords() {
for (Entry<String, List<String>> entry : map.entrySet()) {
boolean flag = isNotDependent(entry.getValue());
// System.out.println("Key : " + entry.getKey() + " isNotDependent :
// " + flag);
if (flag) {
nonDependentList.add(entry.getKey());
} else {
List<String> list = getOnlyDependentList(entry.getValue());
dependentMap.put(entry.getKey(), list);
}
}
// showDependentMap();
refreshDependentMap();
// Final result
Map<String, List<String>> processedMap = addResultsInMap();
return processedMap;
}
private static void refreshDependentMap() {
for (Entry<String, List<String>> entry : dependentMap.entrySet()) {
List<String> list = entry.getValue();
list.removeAll(nonDependentList);
boolean flag = isNotDependent(list);
if (flag) {
nonDependentList.add(entry.getKey());
dependentMap.remove(entry.getKey());
refreshDependentMap();
} else {
continue;
}
}
}
private static Map<String, List<String>> addResultsInMap() {
Map<String, List<String>> processedMap = new LinkedHashMap<String, List<String>>();
for (String key : nonDependentList) {
processedMap.put(key, map.get(key));
}
for (Entry<String, List<String>> entry : dependentMap.entrySet()) {
processedMap.put(entry.getKey(), map.get(entry.getKey()));
}
return processedMap;
}
private static boolean isNotDependent(List<String> list) {
int count = 0;
for (String string : list) {
if (!string.startsWith("STR_")) {
++count;
}
}
if (list.size() == count) {
return true;
}
return false;
}
private static void addRecord(String structureName, List<String> list) {
map.put(structureName, list);
}
private static List<String> getOnlyDependentList(List<String> list) {
List<String> list1 = new ArrayList<>();
for (String string : list) {
if (string.startsWith("STR_")) {
list1.add(string);
}
}
return list1;
}}