Tag: 数据结构

如何在图表中搜索路径?

假设我有一个边列表,每个边包含两个节点(往返)。 找到两个给定节点的边缘的最佳方法是什么? 请注意,边缘中的节点可能会重复。 说我有这种格式的优势: 1 – – > 5 3 7 5 6 2 6 然后查询如1 5将返回true 。 然后查询如5 2将返回true,因为5连接6和6连接到2。 然后查询如1 7将返回false 。 然后查询如7 4将返回false,因为4不存在,这意味着它是无边节点。

Java:有没有办法有效地插入或删除LinkedList中间的许多元素?

我期待在Java的LinkedList中找到它,因为链表的要点是能够有效地插入(和删除)任何地方(假设你有一些指向你想要插入或删除的位置的指针)。 我在API中找不到任何东西。 我忽略了什么吗? 我能找到的最接近的是ListIterator中的add和remove方法。 但这有一些局限性。 特别是,根据API,只要通过remove修改底层LinkedList,其他迭代器就会变为无效。 这也是在我的测试中诞生的; 以下程序导致IllegalStateException: import java.util.*; public class RemoveFromLinkedList { public static void main(String[] args) { LinkedList myList= new LinkedList(); for (int i = 0; i < 10; ++i) { myList.add(i); } ListIterator i1 = myList.listIterator(); ListIterator i2 = myList.listIterator(); for (int i = 0; i < 3; ++i) { i1.next(); […]

生成字符数组的所有排列

在阅读了很多“生成字符串排列”的post之后,我尝试用Java编写它。 1)将第一个字符开始与组合中其余字符交换。 但是当我尝试使用递归实现它时,它只给了我一个长度为3的字符串的字符串:(。 public static void main(String[] args) { char a[]= “123”.toCharArray(); printPermutation(a,0); } private static void printPermutation(char[] a, int i) { if(i==a.length-1) System.out.println(new String(a)); else{ for(int x=i+1;x<a.length;x++) { swap(a,i,x); printPermutation(a,x ); swap(a,i,x); } } } private static void swap(char[] a, int i, int x) { char t=a[i]; a[i]=a[x]; a[x]=t; } 我期待打印6个字符串。 预期:123,132,213,231,312,321

HashMap:以随机顺序迭代键值对

我有一个HashMap,我想在每次获得迭代器时以不同的随机顺序迭代它们的键值对。 从概念上讲,我想在调用迭代器之前“洗牌”地图(或者如果你想要,“洗牌”迭代器)。 我有两种选择: 1)使用LinkedHashMap的方法并在内部保留条目列表,将其随地移动并在调用迭代器时返回该视图。 2)取map.entrySet(),构造一个ArrayList并在其上使用shuffle()。 虽然这两种方法看起来很像我,但我期待非常大的HashMaps,所以我真的很关心细节和内部,因为我真的不能浪费内存或计算。

双向映射的最佳数据结构

我想要一个从键到对象映射的数据结构,反之亦然(不同于仅在单个方向上映射的HashMaps。)一个想法可能是将HashMap存储在自身内以进行反向查找,但这将是一种低效的方法。 什么是双向映射的最佳实现?

仅在匹配阈值字节时才在地图中填充字符串值

我有一个tasks列表对象,我正在迭代并将每个任务对象附加到StringBuilder后跟新行,如下所示。 现在,我将继续在同一个字符串构建器中追加任务对象,直到达到60000字节的大小限制。 一旦达到限制,我将把这个字符串填充为map中的值,key将是带有增量索引的文件名。 然后我将重置字符串构建器和其他东西并再次重复此过程。 因此,如果我有一个大tasks对象,那么我将拆分成多个字符串对象,其大小应始终小于60000字节。 我得到了下面的代码,但我总是看到地图中的值大小超过60000字节。 我做错了什么? 此外,我在两个不同的位置填充HashMap – 一个达到限制,另一个是如果未达到限制。 public void populate(final List tasks) { Map holder = new HashMap(); int size = 0; int index = 0; StringBuilder sb = new StringBuilder(); for (Task task : tasks) { sb.append(task).append(System.getProperty(“line.separator”)); size = sb.toString().getBytes(StandardCharsets.UTF_8).length; if (size > 60000) { String fileName = “tasks_info_” + index […]

Java优先级队列应该如何工作?

简短的故事,我正在实现一个图表,现​​在我正在研究Kruskal,我需要一个优先级队列。 我对优先级队列的定义是具有最小密钥的元素将首先出现? 这是错的吗? 因为当我在队列中插入加权边(或数字)时,它们不会最终排序。 PriorityQueue tja = new PriorityQueue(); tja.add(55); tja.add(99); tja.add(1); tja.add(102); tja.add(54); tja.add(51); System.out.println(tja); 那将打印出来; [1,54,51,102,99,55]。 这不像我希望的那样排序! 是的,我创建了一个进入优先级队列的comperator,该队列从edge对象中提取数字并根据该int进行比较。 所以这应该有用,或者我只是完全误解了这个数据结构如何工作的整个概念?

Java数组是同构的是什么意思,但ArrayLists不是?

如果我们有一个Type [],我们只能在其中存储Type或其子类型。 ArrayList也是如此。 那么为什么说一个是同质的而另一个不是呢?

Java相当于Perl的哈希值

由于超级灵活和方便,我一直在使用很多Perl哈希。 例如,在Perl中我可以执行以下操作: $hash{AREA_CODE}->{PHONE}->{STREET_ADDR} 我想知道如何用Java完成同样的事情,我想它与HashMap有关? 谢谢,

为什么string.indexOf方法的参数是Java中的int

我想知道为什么indexOf方法的参数为int,当描述为char时。 public int indexOf(int ch) Returns the index within this string of the first occurrence of the specified **character** http://download.oracle.com/javase/1,5.0/docs/api/java/lang/String.html#indexOf%28int%29 Also, both of these compiles fine: char c = ‘p’; str.indexOf(2147483647); str.indexOf(c); a]基本上,我很困惑的是java中的int是32位,而unicode字符是16位。 b]为什么不使用字符本身而不是使用int。 这是任何性能优化吗? 字符难以表示而不是整数吗? 怎么样 ? 我认为这应该是一个简单的推理,这让我更加了解它! 谢谢!