假设您有一个存储有序树层次结构的平面表:
Id Name ParentId Order
1 'Node 1' 0 10
2 'Node 1.1' 1 10
3 'Node 2' 0 20
4 'Node 1.1.1' 2 10
5 'Node 2.1' 3 10
6 'Node 1.2' 1 20
Run Code Online (Sandbox Code Playgroud)
这是我们所拥有的图表[id] Name.根节点0是虚构的.
[0] ROOT
/ \
[1] Node 1 [3] Node 2
/ \ \
[2] Node 1.1 [6] Node 1.2 [5] Node 2.1
/
[4] Node 1.1.1
您将使用什么简约方法将其输出为HTML(或文本,就此而言)作为正确排序,正确缩进的树?
进一步假设你只有基本的数据结构(数组和散列图),没有带有父/子引用的花哨对象,没有ORM,没有框架,只有你的双手.该表表示为结果集,可以随机访问.
伪代码或普通英语是可以的,这纯粹是一个概念性的问题.
额外问题:在RDBMS中存储这样的树结构是否有根本更好的方法?
编辑和补充
回答一个评论者(Mark Bessey的)问题:根节点不是必需的,因为它永远不会被显示.ParentId = 0是表示"这些是顶级"的惯例.Order列定义了如何对具有相同父节点的节点进行排序.
我所谈到的"结果集"可以被描绘成一组哈希图(保留在该术语中).因为我的例子意味着已经存在.有些答案会加倍努力并首先构建它,但那没关系.
树可以任意深.每个节点可以有N个子节点.不过,我并没有考虑到"数百万条目".
不要将我选择的节点命名('Node 1.1.1')误认为是依赖的东西.节点同样可以称为"Frank"或"Bob",不暗示命名结构,这只是为了使其可读. …
我不是一个程序员,但我需要在PHP中编写一个简单的preg_replace语句来帮助我使用WordPress插件.基本上,我需要一些代码来搜索字符串,拉出视频ID,并返回插入视频ID的嵌入代码.
换句话说,我正在寻找这个:
[youtube=http://www.youtube.com/watch?v=VIDEO_ID_HERE&hl=en&fs=1]
Run Code Online (Sandbox Code Playgroud)
并希望用它替换它(保持视频ID相同):
param name="movie" value="http://www.youtube.com/v/VIDEO_ID_HERE&hl=en&fs=1&rel=0
Run Code Online (Sandbox Code Playgroud)
如果可能的话,如果你能解释一下你如何在搜索模式中使用各种斜线,插入符号和Kleene星,即将它从grep翻译成英语,我将永远感激,这样我就可以学习.:-)
谢谢!
麦克风
说,我有一个用这行调用的脚本:
./myscript -vfd ./foo/bar/someFile -o /fizz/someOtherFile
Run Code Online (Sandbox Code Playgroud)
或者这个:
./myscript -v -f -d -o /fizz/someOtherFile ./foo/bar/someFile
Run Code Online (Sandbox Code Playgroud)
什么是分析这使得在每一种情况下(或两者的组合)的接受的方式$v,$f以及 $d将全部设置为true和$outFile将等于/fizz/someOtherFile?
使用这样的东西:
try:
# Something...
except Exception as excep:
logger = logging.getLogger("component")
logger.warning("something raised an exception: " + excep)
logger.info("something raised an exception: " + excep)
Run Code Online (Sandbox Code Playgroud)
我宁愿没有错误级别的原因在我的特殊情况下它不是一个错误.
我刚刚安装了SSL证书.此证书使用2048位加密进行加密.
但是,密码是128位加密(或40或其他一些变化,具体取决于浏览器.)
这里似乎有两种不同类型的加密.2048的"握手"加密和一些较小的"线上"加密.
理论上我有这个权利吗?谁能更好地解释一下?
我已经遍布谷歌,无法找到两者之间差异的明确解释.
通常包含脚本的方式是"源"
例如:
main.sh:
#!/bin/bash
source incl.sh
echo "The main script"
Run Code Online (Sandbox Code Playgroud)
incl.sh:
echo "The included script"
Run Code Online (Sandbox Code Playgroud)
执行"./main.sh"的输出是:
The included script
The main script
Run Code Online (Sandbox Code Playgroud)
...现在,如果您尝试从其他位置执行该shell脚本,除非它在您的路径中,否则无法找到包含.
确保脚本可以找到包含脚本的好方法是什么,特别是如果脚本需要可移植的话?
背景:我们开发了win32应用程序,并在Windows上使用"Thompson Toolkit"为我们提供了一个类似于unix的shell,我们将它们用作命令行.
我们有一个GUI程序(带有WinMain和消息循环),我们想要写入控制台,但printf等不起作用,即使我们从控制台启动程序.我们如何从GUI程序写入控制台?我们需要在那里打印文本,以便自动构建系统可以显示错误消息等.
谢谢.
我正在用C#.NET编写Windows窗体应用程序
启动时,应用程序显示一个在单独的线程中运行的启动屏幕.在显示闪屏时,主要应用是初始化.
主应用程序完成初始化后,将显示应用程序的主要形式,并且闪屏仍显示在顶部.
到目前为止,一切都如预期的那样.
然后,关闭启动画面,这会导致该线程退出.出于某种原因,在这一点上,主应用程序窗口被发送到所有其他打开的Windows后面,特别是在Windows资源管理器窗口中,您单击.exe文件以首先运行应用程序!
什么可能导致窗户突然像这样"落后"?
如何在脚本本身中确定Bash脚本文件的名称?
就像我的脚本在文件中一样runme.sh,那么我怎么能让它显示"你正在运行runme.sh"的消息而没有硬编码?
我已经将我在其中一个应用程序中看到的一个问题归结为一个非常简单的复制样本.我需要知道是否有什么不对劲或我遗漏的东西.
无论如何,下面是代码.行为是代码在内存中运行并稳定增长,直到它与OutOfMemoryException崩溃.这需要一段时间,但行为是对象被分配,而不是垃圾收集.
我已经采取内存转储并运行!gcroot对某些事情以及使用ANTS来弄清楚问题是什么,但我已经有一段时间了,需要一些新的眼睛.
此复制示例是一个简单的控制台应用程序,可创建Canvas并为其添加一行.它不断地这样做.这就是所有的代码.它不时地睡觉,以确保CPU不会因为你的系统没有响应而被征税(并且确保GC无法运行并不奇怪).
有人有什么想法?我已经尝试过仅使用.NET 3.0,.NET 3.5以及.NET 3.5 SP1,并且在所有三种环境中都会出现相同的行为.
另请注意,我已将此代码放在WPF应用程序项目中,并通过单击按钮触发代码,它也会出现在那里.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Controls;
using System.Windows.Shapes;
using System.Windows;
namespace SimplestReproSample
{
class Program
{
[STAThread]
static void Main(string[] args)
{
long count = 0;
while (true)
{
if (count++ % 100 == 0)
{
// sleep for a while to ensure we aren't using up the whole CPU
System.Threading.Thread.Sleep(50);
}
BuildCanvas();
}
}
[System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.NoInlining)]
private static void BuildCanvas()
{
Canvas c = new Canvas(); …